如何在基于分类的视图中使用GET和queryset?

时间:2019-05-08 16:51:24

标签: django django-forms django-templates django-views

我有两个带有随机农民和动物的模型(名称/体重),我想在模板中使用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)

但是我希望有一种基于类的方法。

2 个答案:

答案 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

您对ifelse语句的条件有点混乱,因此我怀疑对于某些输入,条件都不会触发,因此不会返回None

答案 1 :(得分:0)

因此,我不再使用基于分类的视图,而是使用一个函数,它起作用了。

co_spawn

但是我希望有一种基于类的方法。

p.s我张贴了这个帖子,以便以后可以关闭该主题,或者如果我回答了,有没有办法关闭我自己的问题?