我正在为我的 django 应用程序制作一个评论系统,有人告诉我最好为评论投票制作一个单独的模型。所以我已经完成了,这是我的 models.py:
class Comment(models.Model):
user = models.ForeignKey(User, default=1)
destination = models.CharField(default='1', max_length=12, blank=True)
author = models.CharField(max_length=120, blank=True)
comment_id = models.IntegerField(default=1)
parent_id = models.IntegerField(default=0)
comment_text = models.TextField(max_length=350, blank=True)
timestamp = models.DateTimeField(default=timezone.now, blank=True)
def __str__(self):
return self.comment_text
class CommentScore(models.Model):
user = models.ForeignKey(User, default=1)
comment = models.ForeignKey(Comment, related_name='score')
upvotes = models.IntegerField(default=0)
downvotes = models.IntegerField(default=0)
def __str__(self):
return str(self.comment)
这是我创建评论的views.py:
def article(request, category, id):
name = resolve(request.path).kwargs['category']
for a, b in CATEGORY_CHOICES:
if b == name:
name = a
instance = get_object_or_404(Post, id=id, category=name)
allauth_login = LoginForm(request.POST or None)
allauth_signup = SignupForm(request.POST or None)
#comments
comment = CommentForm(request.POST or None)
ajax_comment = request.POST.get('text')
comment_length = len(str(ajax_comment))
#database_comment = get_object_or_404(Comments, comment_id=1)
comment_list = Comment.objects.filter(destination=id)
score = CommentScore.objects.filter(comment=comment_list)
if request.is_ajax():
if comment.is_valid():
comment = Comment.objects.create(comment_text=ajax_comment, author=str(request.user), destination=id)
print(comment)
comment.save()
score = CommentScore.objects.create(comment=comment)
score.save()
username = str(request.user)
return JsonResponse({'text': ajax_comment, 'text_length': comment_length, 'username': username})
else:
print(comment.errors)
context = {
'score': score,
'comment_list': comment_list,
'comment': comment,
'instance': instance,
'allauth_login': allauth_login,
'allauth_signup': allauth_signup
}
return render(request, 'article.html', context)
因此,comment
工作正常,但正如您在几行后看到的那样,我尝试创建一个 CommentScore
实例以与 comment 匹配
。在我的模板中,我已经渲染了每条评论及其字段(comment_text
、author
等),但我想渲染关联的 upvotes
字段与该评论
。我该怎么做?
模板
{% for i in comment_list %}
<div class='comment_div'>
<h3>{{ i.author }}</h3>
<p>{{ i.comment_text }}</p><br>
</div>
{% endfor %}
forms.py
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = [
'comment_text',
'id',
'author',
'destination',
]
最佳答案
在您看来,您有这一行:
comment_list = Comment.objects.filter(destination=id)
因此,如果您想获得与 Comment
关联的 CommentScore
,您必须在 View 上这样写:
score = CommentScore.objects.filter(comment=comment_list)
filter
需要多个变量,以便您可以访问模板中的upvotes
,如下所示:
{% for i in score %}
{{i.upvotes}}
{% endfor %}
如果您有单个 score
实例,则必须使用 get
参数:
score = CommentScore.objects.get(comment=comment_list)
那你就可以了
{{score.upvotes}}
在您的模板上
关于python - 如何在模板中呈现外键字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41754621/