我有一个简单的待办事项应用程序,其中每个任务都有一个名为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 %}