如何使用模型管理器访问模板中的对象计数?



我有一个创建Memo对象的模型。我想使用自定义模型管理器的posted方法来返回 Memo 对象的总数 - 然后在模板中使用此数字。我试图将尽可能多的代码保留在我的模型和模型管理器中,而不是在我的视图中,因为我读到这是"两勺 Django"中的最佳实践。

在外壳中,我可以得到这样的备忘录数量:

>>> from memos.models import Memo
>>> Memo.objects.all()
<QuerySet [<Memo: Test Memo 2>, <Memo: Test Memo 1>]>
>>> Memo.objects.all().count()
2

这是我的模型和模型管理器的样子:

class MemoManager(models.Manager):
use_for_related_fields = True
def posted(self):
return self.count()

class Memo(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
date_time = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
objects = MemoManager()
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('memos-detail', kwargs={'pk': self.pk})

我知道这显然是错误的方法,但我在这里感到困惑。那么如何使用我的模型管理器来获取对象计数并在模板中使用它:{{ objects.all.count }}

附言我看到其他帖子显示了如何在视图中执行此操作,但如前所述,我尽量不使用视图。是否需要使用视图?我也明白我的posted方法写错了。

很抱歉,您误解了TSD中的内容。精益视图胖模型旨在将与"业务逻辑"相关的代码排除在视图之外,以及某些特定于模型的内容。请求应由视图处理。因此,当您想要加载模板时,必须首先对应用发出 GET 请求。

应该编写一个视图函数,以便在相应的序列化程序/模型/模型管理器中处理 POST 数据的验证或在数据库中创建新对象或查询/过滤 GET 请求。

当您想要加载模板时应该发生什么。

  1. 具有已创建的模板的 URL 以及为其映射的视图函数
  2. 在视图函数中,您应该渲染所述模板并在上下文中传递必要的数据。
  3. 为了与精益视图胖模型样式保持一致,如果要获取 Memo 的查询集,但仅获取那些is_deleted字段设置为 False 的查询集,则可以覆盖 Memo 模型的模型管理器 get_queryset(( 方法。
  4. 如果要使用POST请求创建新的备忘录,则可以处理 使用模型表单创建!

希望这能解决问题!

编辑:如何将上下文传递给模板,在您的情况下,备忘录计数。

def random_memo_view(request):
context = {'memo_count': Memo.posted()}
return render(request, 'template.html', context=context)

重新编辑我刚刚检查了您是否正在使用详细信息视图。在这种情况下,请遵循 django 文档中的内容。 基于类的视图:添加额外的上下文

最新更新