首页 > 解决方案 > Django如何在查询集中标记用户特定的对象以发送到模板?

问题描述

Django 世界的新手。我有一个看似普遍的问题,但在 Internet 上找不到好的答案。我需要将 django 查询集传递给模板以显示列表。在这些文章对象中,有些可能是用户编写的,我想突出显示/加注这些特定文章。实现这一目标的最佳实践/解决方案是什么?

例如:

 class Article(models.Model) :
   article_text = models.CharField(max=32)
   written_by = models.CharField()

所以我可以访问views.py中所有文章的列表:

 article_list = Articles.objects.all()

我可以按我当前登录的用户过滤所有文章

 my_article = article_list.filter(written_by=current_user)

在模板中,我想显示所有文章的列表,但“星标”仅显示当前登录用户编写的文章

所以在我的模板中我想做这样的事情:

{% for article in article_list %}
  {% if article.some_flag %}
        Starred Article
  {% endif %}
{% endfor %}

问题:有没有一种好方法可以用在views.py 中标记“my_articles”的标志some_flag 来注释“article_list”对象?

或者有没有办法通过同时传递 article_list 和 mylist 并在模板代码中进行查找来在模板中执行此操作?类似的东西(仅用于说明的代码):

{% for article in article_list %}
  {% if article.pk in mylist.keys %}
        Starred Article {{ mylist.pk }}
  {% endif %}
{% endfor %}

任何指针都会非常有帮助。希望问题很清楚。

标签: djangodjango-templatesdjango-queryset

解决方案


首先将您的文章模型更改为:

from django.conf import settings

class Article(models.Model) :
    article_text = models.CharField(max=32)
    written_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

接下来在您的模板中检查用户是否与请求的用户相同:

{% for article in article_list %}
    {% if article.written_by == request.user %}
        Starred Article
    {% endif %}
{% endfor %}

看起来你有一些current_user(不知道这个变量是什么,也许是用户名?)你用来匹配用户,如果你真的不想改变你的模型,你可以将它传递到上下文中并写{% if article.written_by == current_user %}。但我建议在开发时更改文章模型以进一步简化。


推荐阅读