新编写的Django管理器不能在模板中工作



我有一个简单的待办事项应用程序,其中每个任务都有一个名为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中指定通过自定义管理器覆盖默认管理器的模型,如下所示:

    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.
    
  • in your 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 %}
    

最新更新