2010-10-25 3 views
0

Так что есть мнение, что делает QuerySet и возвращает простой список:Как отфильтровать объекты с object_list родового зрения в 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». В основном фильтры. Выполняю большую часть фильтрации в своих представлениях? Или это в моих шаблонах?

Спасибо!

ответ

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

Вы должны сделать всю свою бизнес-логику в представлении, это основная идея работы с картой MVC (MTV).

рядом, если вы хотите использовать форму для фильтрации данных, не имеют выбора, а не переходить от view.py

+0

Хорошо, да, это то, что я угадал. Возможно ли это сделать с помощью общих представлений, а именно object_list? Потому что, как я это делал, с RequestContext (request, {xxxx: xxxx}). Должен ли я перейти на этот метод? – chiurox

Смежные вопросы