我有一个创建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 请求。
当您想要加载模板时应该发生什么。
- 具有已创建的模板的 URL 以及为其映射的视图函数
- 在视图函数中,您应该渲染所述模板并在上下文中传递必要的数据。
- 为了与精益视图胖模型样式保持一致,如果要获取 Memo 的查询集,但仅获取那些is_deleted字段设置为 False 的查询集,则可以覆盖 Memo 模型的模型管理器 get_queryset(( 方法。
- 如果要使用POST请求创建新的备忘录,则可以处理 使用模型表单创建!
希望这能解决问题!
编辑:如何将上下文传递给模板,在您的情况下,备忘录计数。
def random_memo_view(request):
context = {'memo_count': Memo.posted()}
return render(request, 'template.html', context=context)
重新编辑我刚刚检查了您是否正在使用详细信息视图。在这种情况下,请遵循 django 文档中的内容。 基于类的视图:添加额外的上下文