【问题标题】:How to render a foreign key field in Django如何在 Django 中呈现外键字段
【发布时间】:2021-09-20 18:53:43
【问题描述】:

期望的结果:当我渲染一个 Poller 及其关联的 cmets 我还想呈现Vote 为投票者选择的用户以及他的评论(注意:用户只有在投票时才能评论)。

旁注:用户可以对 Poller 投一票,并向 Poller 发表评论。只有事先投票,他才能发表评论。

# Models

class Poller(models.Model):
    poller_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    created_on = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(Account, on_delete=models.CASCADE)
    poller_text = models.CharField(max_length=333)
    poller_choice_one = models.CharField(max_length=20)
    poller_choice_two = models.CharField(max_length=20)


class Vote(models.Model):
    poller = models.ForeignKey(Poller, on_delete=models.CASCADE, related_name='vote')
    user = models.ForeignKey(Account, on_delete=models.CASCADE)
    created_on = models.DateTimeField(auto_now_add=True)
    poller_choice_one_vote = models.BooleanField(default=False)
    poller_choice_two_vote = models.BooleanField(default=False)

    def __str__(self):
        return f'Vote by {self.user}'


class Comment(models.Model):
    poller = models.ForeignKey(Poller, on_delete=models.CASCADE, related_name='PollerComment')
    user = models.ForeignKey(Account, on_delete=models.CASCADE)
    created_on = models.DateTimeField(auto_now_add=True)
    comment = models.TextField(max_length=350)
    flag_count = models.IntegerField(default=0)
    upvote_count = models.IntegerField(default=0)
    downvote_count = models.IntegerField(default=0)
# View

@require_GET
def render_single_poller(request, poller_id):

    # Retrieve comments associated to the Poller
    comments_qs = PollerComment.objects.filter(poller_id=poller_id)

context = {
        'comments_qs': comments_qs,
    }
    return render(request, 'pollboard/single_poller.html', context)

我试图通过这样的模板过滤器来做到这一点:

# pollboard_tags.py

@register.filter(name='get_vote')
def get_voted(self):
    self.vote_made = 'Test'
    print(self.vote.poller_choice_one_vote)
    if self.vote.poller_choice_one_vote:
        self.vote_made = 'One'
    else:
        self.vote_made = 'Two'
    return self.vote_made
# template

<div class="commentors-poller-choice">{{ comment|get_vote }}</div>

抛出

RelatedObjectDoesNotExist 在 /poller/68c725eb-277e-4b5b-a61b-b4a02bf5e854/ PollerComment 没有投票权。

我担心我在这里已经把事情复杂化了。我希望有一个更直接的解决方案,比如 idk 通过渲染所需的信息扩展 cmets 查询集?

【问题讨论】:

  • 尝试将self.vote = 'Two' 更改为self.vote_made = 'Two'。如果self.vote.poller_choice_one_vote 返回false,self.vote_made 将为空
  • @BrianD 啊,谢谢你的提示,但它仍然没有返回任何东西。虽然我确实在模板循环中渲染了其他字段,所以查询集是存在的
  • 您如何使用PollerComment 进行过滤? PollerComment 是相关名称而不是模型,对吗?

标签: django django-models django-queryset


【解决方案1】:

如果用户只能对轮询器投票一次,您可以使用以下方式进行过滤:

@register.filter(name='get_vote')
def get_voted(self):
    vote = Vote.objects.get(poller=self.poller, user=self.user)
    return 'One' if vote.poller_choice_one_vote else 'Two'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 2018-12-26
    • 2021-10-25
    • 1970-01-01
    • 2020-06-23
    相关资源
    最近更新 更多