Как использовать get_queryset с Django DetailView с self.request.GET.get ("q") - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь выяснить, как включить 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. Он не знает о ПК.

1 Ответ

0 голосов
/ 30 мая 2019

Итак, после долгих раздумий об этом ... оказывается, я переосмыслил это ...

Мне просто нужно обновить мой get_object в соответствии с отфильтрованными критериями ...

def get_object(self, queryset=None):
    return get_object_or_404(Author, request_number=self.request.GET.get("q"),user=self.request.user,id="1")
    return get_object_or_404

Добавлены пользователь и идентификатор в критерии фильтра get_object.

...