Django如何在查询集中标记用户特定的对象以发送到模板?

Posted

技术标签:

【中文标题】Django如何在查询集中标记用户特定的对象以发送到模板?【英文标题】:Django how to mark user-specific objects in queryset to be sent to template? 【发布时间】:2021-04-24 09:56:54 【问题描述】:

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 %

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

【问题讨论】:

【参考方案1】:

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

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 %。但我建议在开发过程中更改文章模型以进一步简化。

【讨论】:

非常感谢@AbdulAzizBarkat。我想我对如何做到这一点有了大致的了解。看起来解决方案是只向模板发送一个查询集并使用 Django db 链接来获取所需的对象。谢谢

以上是关于Django如何在查询集中标记用户特定的对象以发送到模板?的主要内容,如果未能解决你的问题,请参考以下文章

Django DRF - 视图集中的补丁请求对象?

Django:更新查询集中对象的顺序属性

Django 在不使用字段查找的情况下从查询集中排除特定实例

Django:如何从与用户相关的子查询集中获取不同的父列表?

从 django 中的 User.objects.all() 查询集中排除用户的朋友列表

如何在查询集中动态设置 Django 过滤器