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 在不使用字段查找的情况下从查询集中排除特定实例
Django:如何从与用户相关的子查询集中获取不同的父列表?