Как использовать GET и набор запросов в классифицированных представлениях? - PullRequest
0 голосов
/ 08 мая 2019

У меня есть две модели со случайными фермерами и животными (имена / вес), и я хочу использовать метод GET в моем шаблоне, чтобы применить фильтр в моем представлении к моим моделям.Например: покажи мне все данные с именем "xyz"

, таков был мой подход:

models.py

class Farmer(models.Model):
    first_name = models.CharField(max_length=40)
    last_name = models.CharField(max_length=40)
    city = models.CharField(max_length=40)
    <...>

class Animal(models.Model):
    name = models.CharField(max_length=40)
    weight = models.DecimalField(max_digits=5, decimal_places=2)
    species = models.ForeignKey('Species', on_delete=models.CASCADE)
    farmer = models.ForeignKey('Farmer', related_name='farmername', on_delete=models.CASCADE)
    <...>

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

template.html

    <...>
<form action="" method="GET">
    name: <input type="text" name="q"><br>
    <input type="submit" value="Search">
</form>

    <...>

, это был мой подход, чтобы вписаться в метод GET и Q вmy view views.py

from django.views.generic import TemplateView
from django.views.generic import View
from django.shortcuts import render
from django.db.models import Q

    <...>

class HomeView(TemplateView):
   template_name = 'farmapi/search.html'
   http_method_names = ['get']

   def get(self, request):
        query = request.GET.get("q")

   def get_context_data(self, **kwargs):
        context = super(HomeView, self).get_context_data(**kwargs)
        context['farmers'] = Farmer.objects.filter(Q(first_name__icontains=query)|Q(last_name__icontains=query))
        context['animals'] = Animal.objects.filter(Q(name__icontains=query))

        return context

Это сообщение об ошибке, которое я получаю

ValueError в / data / search /

view farmapi.views.HomeView не возвращает объект HttpResponse.Вместо этого он вернул None.

, насколько я понимаю, я должен использовать оператор if ?

class HomeView(TemplateView):
   template_name = 'farmapi/search.html'
   http_method_names = ['get']

   def get(self, request):
        query = request.GET.get("q")

   def get_context_data(self, **kwargs):
        context = super(HomeView, self).get_context_data(**kwargs)
        if query is not None and query != '':
            context['farmers'] = Farmer.objects.filter(Q(first_name__icontains=query)|Q(last_name__icontains=query))
            context['animals'] = Animal.objects.filter(Q(name__icontains=query))
            return context
        if query is None and query != '':
            context['farmers'] = Farmer.objects.all()
            context['animals'] = Animal.objects.all()
            return context

К сожалению, это не работает, я получил то же сообщение об ошибке.Я был бы признателен, если у кого-то есть подсказка или, может быть, он знает несколько хороших учебников по django с темой «запрос, запрос с помощью шаблонов и фильтров» - я искал часы, но большинство вещей было связано с запросами и оболочкой Python.

Обновление


Решение

Поэтому вместо использования классического представления я использую функцию, и она работает,

def search(request):

    query = request.GET.get("q")

    if query is not None and query != '': # <----
        farmers = Farmer.objects.filter(Q(first_name__icontains=query)|Q(last_name__icontains=query))
        animals = Animal.objects.filter(Q(name__icontains=query))
        context = {'animals': animals,
                   'farmers': farmers}
        return render(request, 'farmapi/search.html', context)
    else:  # <----
        farmers = Farmer.objects.order_by("-id")[0:2]
        animals = Animal.objects.order_by("-id")[0:2]
        context = {'animals': animals,
                   'farmers': farmers}
        return render(request, 'farmapi/search.html', context)

однако я бы хотел, чтобы был классный путь.

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Я бы попробовал следующую настройку

 def get_context_data(self, **kwargs):
        context = super(HomeView, self).get_context_data(**kwargs)
        if query is not None and query != '': # <----
            context['farmers'] = Farmer.objects.filter(Q(first_name__icontains=query)|Q(last_name__icontains=query))
            context['animals'] = Animal.objects.filter(Q(name__icontains=query))
            return context
        else:  # <----
            context['farmers'] = Farmer.objects.all()
            context['animals'] = Animal.objects.all()
            return context

Ваши условия для операторов if и else немного сбивают с толку, поэтому я подозреваю, что для некоторых входов ни одно из условий не сработало и None не былопоэтому вернулся.

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

Таким образом, вместо использования классического представления, я теперь использую функцию, и она сработала.

def search(request):
    query = request.GET.get("q")

    if query is not None and query != '': # <----
        farmers = Farmer.objects.filter(Q(first_name__icontains=query)|Q(last_name__icontains=query))
        animals = Animal.objects.filter(Q(name__icontains=query))
        context = {'animals': animals,
                   'farmers': farmers}
        return render(request, 'farmapi/search.html', context)
    else:  # <----
        farmers = Farmer.objects.order_by("-id")[0:2]
        animals = Animal.objects.order_by("-id")[0:2]
        context = {'animals': animals,
                   'farmers': farmers}
        return render(request, 'farmapi/search.html', context)

как бы мне ни хотелось, чтобы был классный путь.

p.s я опубликовал это, чтобы позже закрыть эту тему или есть способ закрыть свой вопрос, если я ответил на него?

...