Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用模型管理器访问模板中的对象计数?_Python_Django - Fatal编程技术网

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)