如何在Django中过滤通用视图的object_list的对象

时间:2010-10-25 22:18:43

标签: python django

所以我有一个查看集的视图并返回一个简单的列表:

def cdr(request):
  queryset = CdrView.objects.all()
  return object_list(request, 
                     queryset = queryset,
                     template_name = "reports/cdrview_list.html",
                     paginate_by = 200,
                     page = request.GET.get('page', 1)
                     )

最初,只是为了知道它是否有效,我在模板中逐行打印了“object_list”中的所有对象,它没关系,但是很难看。问题是我的数据库不断增长,目前有超过一百万个对象。每个对象(就像电话一样)都有源和目的地等其他属性,例如方向(进出)。在我的模板中,我通过执行以下操作来调用它:
    {{call.src}} {{call.dst}} 由于我在Django中相当新,我有一个问题,我如何能够在页面顶部显示一个表单,我选择只查看方向为“in”的调用或具有源的调用以“xxxx”开头。基本上是过滤器。 我在观看中做了大部分过滤吗? 或者它在我的模板中?

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以在views.py中进行过滤。由于这是搜索,我们将使用request.REQUEST代替普通request.POST

from forms.py import SearchForm

def cdr(request, form_class=SearchForm):
  queryset = CdrView.objects.all()
  search_form = SearchForm(request.REQUEST)
  if search_form.is_valid():
      search_src = search_form.cleaned_data.get('search_src',None)
      search_dest = search_form.cleaned_data.get('search_dest',None)
      if search_src:
          queryset = queryset.filter(src__icontains=search_src)
      if search_dest:
          queryset = queryset.filter(dest__icontains=search_dest)
  return object_list(request, 
                     queryset = queryset,
                     template_name = "reports/cdrview_list.html",
                     extra_context = {'search_form': search_form },
                     paginate_by = 200,
                     page = request.GET.get('page', 1)
                     )

然后,在forms.py

from django import forms

class SearchForm(forms.Form):
    search_src = forms.CharField(max_length=20, required=False)
    search_dest = forms.CharField(max_length=20, required=False)

然后在你的模板中:

<form method="get" action="">
<ul>{{ search_form.as_ul }}</ul>
<input type="submit" value="Search" />
</form>

答案 1 :(得分:1)

您应该在视图中执行所有业务逻辑,这是使用MVC(MTV)框架的基本思想。

如果您想使用表单过滤数据,则无法选择而不是从view.py传递