python - 如何在模板中呈现外键字段?

标签 python django django-templates django-views

我正在为我的 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_textauthor 等),但我想渲染关联的 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/

相关文章:

python - 从存储在数据库中的 HTML 渲染 iframe

python - Django模板,如何制作一个选择了预定义值的下拉框?

python - Pandas DataFrame 对象继承还是对象使用?

mysql - 带FOREIGN KEY的Django Mysql迁移报错150

python - 为什么我会使用 tf.concat 而不是 tf.stack?

php - 请建议一些替代 Drupal 的方法

django - 将南迁移与 IBM Bluemix 结合使用

Django 模板转义

python - 类型错误:apply_gradients() 获得意外的关键字参数 'global_step'

image - 这种裁剪算法更优雅的改写是什么? (在 Python 中)