【问题标题】:New Written Django Manager is not working in the template新的书面 Django 管理器在模板中不起作用
【发布时间】:2021-10-14 19:58:20
【问题描述】:

我有一个简单的 todolist 应用程序,其中每个任务都有一个名为 is_deleted 的布尔字段。在我的列表模板中,我只想显示带有 is_deleted=False 的任务。

我知道在我看来我可以使用Task.objects.all().filter(is_deleted=False);但我想在我的 模板 中与经理一起做。这是我的经理:

    class TaskManager(models.Manager):
        def available(self):
            return self.filter(is_deleted=False)
              .
              .
     objects = TaskManager()

这是我的看法:

class TaskList(ListView):
    model = models.Task
    context_object_name="tasks"
    template_name = "home/list.html"
    paginate_by=5  

这是我模板中的条件:

 {% if tasks.available%} ...

【问题讨论】:

  • "我知道在我看来我可以使用Task.objects.all().filter(is_deleted=False);但我想在我的模板中使用经理。" 如果你有什么理由在问题......否则你的问题没有多大意义......

标签: python django templates view


【解决方案1】:

我的回答是对你工作的补充/更正:

  • 你的经理没事

  • 但您需要在 Task 模型中指定您通过自定义管理器覆盖默认管理器,如下所示:

      Class Task(models.Model):
          # others fields here
    
          # override the default objects manager
          objects = TaskManager()
          # You can also define a new manager and keep the default objects, in the case you will use it later.
          # objects = models.Manager() -> Task.objects.all() give all objects
          # is_available = TaskManager() -> Task.is_available.all() give only nt deleted task.
    
  • 在你的views.py中

      class TaskList(ListView):
          model = models.Task
          context_object_name="tasks"
          template_name = "home/list.html"
          paginate_by=5
    
          # If you override the default objects manager with TaskManager
          # Then you are nothing to do, {{ tasks }} is the queryset in the template
    
          # If you defined two managers as recommended above, then you need
          # to override the queryset attribute of the ListView
          queryset = Task.is_available.all()  # Explicit call of custom manager
    
  • 无论如何,在您的模板中,您不需要 {% if %} 标签来过滤结果,您的所有任务都可以在 context_object_name 值名称上使用。

      {% for task in tasks %}
      {{ task.name }}
      ...
      {% endfor %}
    

【讨论】:

    猜你喜欢
    • 2013-06-07
    • 2017-02-19
    • 2012-08-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    相关资源
    最近更新 更多