Python 如何使用模型管理器访问模板中的对象计数?
我有一个创建Python 如何使用模型管理器访问模板中的对象计数?,python,django,Python,Django,我有一个创建Memo对象的模型。我想使用自定义模型管理器的posted方法返回备忘录对象的总数-然后在模板中使用此数字。我试图在我的模型和模型管理器中尽可能多地保留代码,而在我的视图中保留更少的代码,因为我了解到这是“两勺Django”中的最佳实践 在shell中,我可以获得备忘录的数量,例如: >>> from memos.models import Memo >>> Memo.objects.all() <QuerySet [<Memo: Te
Memo
对象的模型。我想使用自定义模型管理器的posted
方法返回备忘录对象的总数-然后在模板中使用此数字。我试图在我的模型和模型管理器中尽可能多地保留代码,而在我的视图中保留更少的代码,因为我了解到这是“两勺Django”中的最佳实践
在shell中,我可以获得备忘录的数量,例如:
>>> from memos.models import Memo
>>> Memo.objects.all()
<QuerySet [<Memo: Test Memo 2>, <Memo: Test Memo 1>]>
>>> Memo.objects.all().count()
2
我知道这显然是错误的做法,但我在这里把自己弄糊涂了。那么,如何使用我的模型管理器来获取对象的计数,并在类似于:{{{objects.all.count}}
的模板中使用它呢
另外,我看到其他帖子在视图中展示了如何做到这一点,但正如前面所说的,我试图不使用视图。是否需要使用视图?我也理解我发布的
方法写得不正确。很抱歉,您误解了TSD中的内容。精益视图Fat模型旨在将与“业务逻辑”相关的代码以及某些特定于模型的内容排除在视图之外。请求应由视图处理。因此,当你想加载模板时,你必须首先向你的应用程序发出GET请求
应该编写视图函数,以便在相应的序列化程序/模型/模型管理器中处理POST数据的验证、在DB中创建新对象或GET请求的查询/筛选
要加载模板时应该发生什么
为已创建的模板创建url,并为其映射视图函数
在view函数中,您应该呈现所述模板,并在上下文中传递必要的数据
为了与精益视图Fat模型样式保持一致,如果您希望获取备忘录的查询集,但仅获取那些将其is_deleted字段设置为False的备忘录,则可以覆盖备忘录模型的模型管理器get_Queryset()方法
如果您想创建带有POST请求的新备忘录,您可以处理
使用模型表单进行创建李>
希望这能把事情弄清楚
编辑:
如何将上下文传递给模板,在您的例子中是备注计数
def random_memo_view(request):
context = {'memo_count': Memo.posted()}
return render(request, 'template.html', context=context)
重新编辑
我刚刚检查了您是否使用了DetailView。在本例中,请遵循django文档中的说明。
你能给我们看一下这个房间的景色吗?最佳解决方案在很大程度上取决于您使用的视图类型。我的视图是CBV本身:class memodailview(DetailView):model=Memo
。但是我也会在列表视图
中遇到这个问题。Django文档中是否有特定的地方可以更好地解释这一点?让我们使用我看到的一个示例,您可以创建一个轮询管理器
,并告诉模型objects=PollManager()
。但是如何在模板中使用_counts()
访问OpinionPoll.objects。Django抛出了一个关于无法在模板中访问管理器的错误。嗯,我们这样说吧。您的模型(以及相关的模型管理器)基本上是模型实例的蓝图。如果要访问属性,则该属性必须是模型实例的一部分,而不是蓝图。如果要在模板中获取备注计数,必须通过视图向模板传递上下文。上下文基本上是一个字典,其中包含模板可以访问的值/对象。我已经编辑了我的答案,这应该可以帮助您进行查询。但是,您似乎是django的初学者,我建议在学习的初始阶段不要使用基于类的通用视图。通用CBV需要更少的代码,但抽象了太多的东西,并且隐式地做了太多的事情,这可能会造成混乱。我会建议坚持正常的看法(CBV或FBV的你)。这可能会帮助您理解django应用程序是如何处理HTTP请求的。您的详细回复非常有帮助,我将继续阅读Django文档,了解您提出的问题是正确的,也在正确的轨道上。使用模型管理器通常有很多原因(创建自定义查询集只是其中之一)。如果你有时间,请阅读这篇文章。
def random_memo_view(request):
context = {'memo_count': Memo.posted()}
return render(request, 'template.html', context=context)