Перенаправить, если запрос не дал результата - PullRequest
1 голос
/ 29 мая 2020

Я создал страницу с входом, который подключается к этому представлению:

class SearchResultView(ListView):
    model = RecipeSet

    template_name = 'core/set_result.html'
    context_object_name = 'recipe_set'

    def get_queryset(self):
        query = self.request.GET.get('q')
        object_list = RecipeSet.objects.filter(
            Q(set_name__exact=query)
        )
        if object_list.exists():
            return object_list
        else:
            return redirect('core:dashboard')

Я использовал set_name__exact для этого запроса и хочу перенаправить пользователей, если поиск не дал никаких объектов, как мне go об этом? Я пытался использовать оператор if / else для проверки объектов, но это, похоже, не работает.

Ответы [ 2 ]

3 голосов
/ 29 мая 2020

Метод .get_queryset(…) [Django -doc] должен возвращать QuerySet, а не список, кортеж, HttpResponse, et c.

Однако вы можете изменить поведение, установив для атрибута allow_empty значение allow_empty = False и переопределив метод dispatch таким образом, чтобы в случае Http404 вы перенаправляли:

from django.http import Http404
from django.shortcuts import redirect

class SearchResultView(ListView):
    <b>allow_empty = False</b>
    model = RecipeSet
    template_name = 'core/set_result.html'
    context_object_name = 'recipe_set'

    def get_queryset(self):
        return RecipeSet.objects.filter(
            set_name=self.request.GET.get('q')
        )

    def <b>dispatch</b>(self, *args, **kwargs):
        try:
            return super().dispatch(*args, **kwargs)
        except <b>Http404</b>:
            return redirect(<i>'core:dashboard'</i>)
0 голосов
/ 29 мая 2020

Лично я бы просто изменил .exists на .count:

class SearchResultView(ListView):
model = RecipeSet

template_name = 'core/set_result.html'
context_object_name = 'recipe_set'

def get_queryset(self):
    query = self.request.GET.get('q')
    object_list = RecipeSet.objects.filter(
        Q(set_name__exact=query)
    )
    if object_list.count():
        return object_list
    else:
        return redirect('core:dashboard')
...