【问题标题】:Django template if choice fieldDjango模板如果选择字段
【发布时间】:2018-12-30 17:52:06
【问题描述】:

我目前正试图弄清楚如何检查状态是否适用于用户请求。

models.py

class CategoryRequests(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    status = StatusField()
    STATUS = Choices('Waiting', 'Rejected', 'Accepted')

views.py

def view_profile_categoy_requests_accepted(request, pk=None):
    if pk:
        user = get_user_model.objects.get(pk=pk)
    else:
        user = request.user
    args = {'user': user}
    return render(request, 'myproject/category_request_accepted.html', args)

但是在模板上这似乎是错误的。

模板.html

{% if user.categoryrequests.status == 'Waiting' %}

提前致谢

【问题讨论】:

  • status 的值是多少?你能{{ user.categoryrequests.status }}看看它输出了什么吗?
  • 似乎是空的,我真的必须在views.py中处理这个吗?如果是,怎么做?
  • 你可以在任何地方处理它,但如果它是空的,那么它永远不会匹配'Waiting'
  • 它写在数据库中,但我不知道为什么我无法访问该字段:(

标签: python django templates


【解决方案1】:

问题出在——user.categoryrequests。如果你没有在外键字段上设置related_name,你就不能像这样进行反向查找。

你有两个选择:

1. 使用user.categoryrequests_set 从用户那里获取反向外键。

2. 或者,将外键上的 related_name 设置为 categoryrequests,然后您可以按照当前的方式进行反向查找。


请参阅有关执行reverse lookups 的文档。

【讨论】:

  • {% if user.categoryrequests.cr_status == Waiting %} 和 author = models.ForeignKey(User, on_delete=models.CASCADE,related_name='cr_status') 完成这项工作。谢谢大家:D
【解决方案2】:

您可以在您的 models.py 中将 related_name 参数添加到 ForeignKey

class CategoryRequests(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='status')
    status = StatusField()
    STATUS = Choices('Waiting', 'Rejected', 'Accepted')

然后在模板中类似:

{% if user.status.STATUS == 'Waiting' %}

This answer 详细解释了related_name

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2021-04-01
    • 2017-11-20
    • 1970-01-01
    • 2018-05-30
    • 2016-03-10
    相关资源
    最近更新 更多