Новый написанный 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 %}
    
Вернуться на верх