Я пытаюсь выяснить, как включить get_queryset в мой подробный вид Django. В нормальном случае использования у меня это работает, добавьте get_queryset к DetailView и вуаля! Это работает .... Однако этот вариант использования немного отличается.
Я использую FormView для получения значения поиска, а затем, при успехе, возвращаю подробный вид. Это тоже работает правильно. Когда я пытаюсь включить get_queryset для переопределения набора запросов, тогда все идет не так, как надо.
Вот мой код:
FormView
class AuthorSearchView(LoginRequiredMixin,FormView):
form_class = AuthorSearchForm
template_name = 'author_search.html'
def get_form_kwargs(self):
kwargs = super(AuthorSearchView, self).get_form_kwargs()
kwargs['user'] = self.request.user
kwargs['q'] = self.request.GET.get("q")
return kwargs
Тогда в моем author_search.html:
<form method="GET" autocomplete=off action="{% url 'Author:author_search_detail' %}">
Когда пользователь вводит значение в поиске ... он возвращает экран DetailView:
class AuthorSearchDetailView(LoginRequiredMixin,DetailView):
model = Author
context_object_name = 'author_detail'
template_name = 'author_search_detail.html'
def get_object(self, queryset=None):
return get_object_or_404(Author, request_number=self.request.GET.get("q"))
return get_object_or_404
Код выше работает нормально. Обратите внимание, что я не использую ссылку PK в моей ссылке на действие, так как она не нужна для этого подхода. Мой URL в случае кода выше:
url(r'^author_search_detail/$',views.AuthorSearchDetailView.as_view(), name='author_search_detail'),
Однако, когда я пытаюсь включить get_queryset вместо get_object с кодом ниже:
def get_queryset(self):
queryset = super(AuthorSearchDetailView, self).get_queryset()
return queryset.filter(request_number=self.request.GET.get("q"))
Тогда я получаю:
AuthorSearchDetailView must be called with either an object pk or a slug in the URLconf.
Я понял, это потому, что я использую DetailView и не предоставляю PK в своем URL.
Однако, когда я иду, чтобы добавить pk в мой HTML и мой URL, как показано ниже:
<form method="GET" autocomplete=off action="{% url 'Author:author_search_detail'pk=author.pk %}">
URL:
url(r'^author_search_detail/(?P<pk>\d+)/$',views.AuthorSearchDetailView.as_view(), name='author_search_detail'),
Я получаю ....
Reverse for 'author_search_detail' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['Author/author_search_detail/(?P<pk>\\d+)/$']
Любопытно, что если я заменю pk = author.pk на pk = user.pk, я не получу ошибку. Так что это заставляет меня поверить в то, что, поскольку я первоначально использую FormView для получения DetailView success_url ... что существует проблема со ссылкой на pk в FormView. Он не знает о ПК.