开发者

How to filter objects of an object_list of a generic view in Django

开发者 https://www.devze.com 2023-01-21 18:15 出处:网络
So I have a view that does a queryset and returns a simple list: def cdr(request): queryset = CdrView.objects.al开发者_JAVA百科l()

So I have a view that does a queryset and returns a simple list:

def cdr(request):
  queryset = CdrView.objects.al开发者_JAVA百科l()
  return object_list(request, 
                     queryset = queryset,
                     template_name = "reports/cdrview_list.html",
                     paginate_by = 200,
                     page = request.GET.get('page', 1)
                     )

Initially, just to know if it works, I printed all the objects in "object_list" line by line in my template and it's OK but butt ugly. The problem is that my database is constantly growing and is currently at over a million objects. Each object (it's like a phone call) has source and destination among other attributes such as direction (in or out). In my template I call it by doing something like:

{{ call.src }} {{ call.dst }} Since I'm fairly new in Django, I have a question on how I can make a form to be displayed at the top of my page where I an choose to see only calls that have direction as "in" or calls that have a source that starts with "xxxx". Basically filters. Do I do most of the filtering in my views? Or is it in my templates?

Thank you!


You filter in your views.py. Since it's a search, we'll use request.REQUEST instead of the normal 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)
                     )

Then, in 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)

And then in your template:

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


You should do all your business logic in the view, this is the basic idea of working with an MVC (MTV) framework.

beside if you want to use a form for filtering your data, you don't have a choice rather than pass from the view.py

0

精彩评论

暂无评论...
验证码 换一张
取 消