Новый написанный Django Manager не работает в шаблоне
У меня есть простое приложение 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, что вы переопределяете менеджер по умолчанию вашим пользовательским менеджером, вот так :
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 %}