Django 다 대다 필드 데이터 렌더링

Sep 03 2020

저자와 편집자가 모두 편집 옵션을 가질 수 있고 편집자는 저자가 할당 할 수있는 블로그 사이트를 만들고 싶었습니다. 이제 내 모델 필드는 다음과 같습니다.

class Editor(models.Model):

name = models.OneToOneField(Author, on_delete=models.CASCADE, null=True, blank=True)


class Blog(models.Model):


title = models.CharField(max_length=150, null=True, blank=True)
author = models.ForeignKey(Author, on_delete=models.CASCADE, null=True, blank=True)
editor = models.ManyToManyField(Editor, blank=True)
date_created = models.DateTimeField(auto_now_add=True)
article = models.TextField(blank=True, null=True)
genre = models.ManyToManyField(Genre, blank=True)


def __str__(self):
    return self.title

및 views.py :

def blog(request, pk):


if request.user.is_authenticated:
    blogs = Blog.objects.get(id=pk) //for dynamic url
    editors = Editor.objects.all()

context = {'blogs':blogs,'editors':editors}
return render(request, 'blog/blog.html', context)

그런 다음 액세스하는 사람이 저자인지 편집자인지 확인하고 싶었으므로 if 조건을 작성했습니다.

{% if request.user.author == blogs.author or blogs.editor %}
<a href="#" class="btn btn-warning">Edit</a>
{% endif %}

하지만 안타깝게도 편집 버튼은 누구나 액세스 할 수 있습니다. 어떻게해야합니까?

답변

southernegro Sep 04 2020 at 03:20

가장 먼저.

{% if request.user.author == blogs.author or blogs.editor %}
<a href="#" class="btn btn-warning">Edit</a>
{% endif %}

이 코드에서는 조건이 잘 정의되어 있지 않습니다. 내 제안은 이렇게 만드는 것입니다.

{% if request.user.author == blogs.author or request.user.author == blogs.editor %}
<a href="#" class="btn btn-warning">Edit</a>
{% endif %}

이것은 하나의 제안입니다.

이제 또 다른 가능성은 JavaScript를 사용하는 것입니다.

이를 위해 내 자신의 코드 예제를 제공합니다.

<script type="text/javascript">
        var editor = '{{user.author.editor}}'

        if (editor == 'False'){
            document.getElementById('edit').innerHTML = ''
        }
</script>

이 코드에서는 사용자가 편집자가 아닌 경우 id 'edit'로 요소 (html)를 숨기지 않을 것임을 정의합니다. 따라서 템플릿에서 요소에 ID를 설정하십시오.

<a id="edit" href="#" class="btn btn-warning">Edit</a>

이를 위해 모델에 부울 필드를 설정해야합니다. 다음과 같이 할 수 있습니다.

class Editor(models.Model):

 name = models.OneToOneField(Author, on_delete=models.CASCADE, null=True, blank=True)
 editor = models.Boolean()