У меня есть две модели со случайными фермерами и животными (имена / вес), и я хочу использовать метод 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)
однако я бы хотел, чтобы был классный путь.