test_func для UserPassesTestMixin с get_object не работает с ListView - PullRequest
0 голосов
/ 11 апреля 2019

в разделе контактов на панели инструментов моих проектов сохраненные контакты видны только автору, но ранее они были видны всем, потому что я забыл включить UserPassesTestMixin в CBV.Я включил, но браузер показал мне ошибку с именем NotImplemented test_func, я также реализовал test_func

views.py

class ContactListView(LoginRequiredMixin, UserPassesTestMixin, ListView):
   model = ClientContact
   template_name = 'site/contacts.html'
   context_object_name = 'contacts'
   ordering = ['created_at', '-updated_at']

   def test_func(self):
       contact = self.get_object()
       if self.request.user == contact.author:
          return True
       return False

, он снова говорит NotImplemented test_func, а также get_ojectявляется неразрешенной ссылкой в ​​ListView. Я уверен, что делаю что-то не так, но не могу найти свою ошибку.Пожалуйста, если кто-то, кто знает это, поправьте меня!Спасибо

1 Ответ

1 голос
/ 11 апреля 2019

ListView для отображения нескольких объектов, поэтому нет смысла вызывать get_object() (для представлений для одного объекта, например DetailView).

Обычный подход для представлений списка - переопределить get_queryset и отфильтровать набор запросов, чтобы показать только объекты этого пользователя.

class ContactListView(LoginRequiredMixin, ListView):
    model = ClientContact
    template_name = 'site/contacts.html'
    context_object_name = 'contacts'
    ordering = ['created_at', '-updated_at']

    def get_queryset(self):
        return super(ContactListView, self).get_queryset().filter(author=self.request.user)

У вас уже есть LoginRequiredMixin, который будет обрабатывать случай, когда пользователь не вошел в систему.

Если вы хотите отфильтровать набор запросов в нескольких представлениях списка, вы можете написать миксин, например:

class AuthorMixin(object):
    def get_queryset(self):
        return super(AuthorMixin, self).get_queryset().filter(author=self.request.user)

Тогда используйте его в своем представлении как:

class ContactListView(LoginRequiredMixin, AuthorMixin, ListView):
    ...

Обратите внимание, что вышеприведенное не проверено, для него требуется LoginRequiredMixin (поскольку оно не обрабатывает случай анонимного пользователя), и оно будет работать, только если внешний ключ пользователя имеет имя author. Вы можете улучшить миксин, но можете повторить метод get_queryset.

...