我有两个带有随机农民和动物的模型(名称/体重),我想在模板中使用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纳入我的观点的方法 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
这是我收到的错误消息
/ p / data / search / 中的ValueError
视图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 shell相关。
更新
解决方案
因此,我现在不使用基于分类的视图,而是使用一个函数,它起作用了。
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)
但是我希望有一种基于类的方法。
答案 0 :(得分:1)
我会尝试以下调整
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
。
答案 1 :(得分:0)
因此,我不再使用基于分类的视图,而是使用一个函数,它起作用了。
co_spawn
但是我希望有一种基于类的方法。
p.s我张贴了这个帖子,以便以后可以关闭该主题,或者如果我回答了,有没有办法关闭我自己的问题?