所以我有一个查看集的视图并返回一个简单的列表:
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”开头。基本上是过滤器。
我在观看中做了大部分过滤吗?
或者它在我的模板中?
谢谢!
答案 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传递