On Nov 23, 8:51 am, Aizen <[email protected]> wrote: > Hi, > > I'd like to implement filtering for my app...currently, the filtering > I have is stateless and so I can't add onto whatever value the user > last selected. I've also implemented each filter separately, so I'd > like to know how I can condense the five filters into one.
There are a couple of confounding points in your question. First question is about combining your filters. The solution there seems to be to factor out your query building code out of your views and return the the resulting queryset. Then, these can be chained together in any of your views just like any other queryset. The other question seems to be about "refining" a filter? That is confining a filter operation to an existing found set, and have that functionality spread across multiple requests. You basically will need to figure out a way to pass this along between requests, using either hidden form fields, or session framework. I started to work on adding this as a feature to Alex Gaynor's django- filter, but got bogged down working out some details. Either way you should check out that project as it would at least make your existing implementation easier. http://github.com/alex/django-filter -Preston > The code > for my filters is as follows: > > def year_filter(request, year): > vehicle_query = Vehicle.objects.filter( > common_vehicle__year__year__exact=year > ).exclude(status__status='Incoming') > > vehicle_list = vehicle_query.order_by( > 'common_vehicle__series__model__manufacturer__manufacturer', > 'common_vehicle__series__model__model', > 'common_vehicle__year' > ) > > vehicle = paginate(request, vehicle_list) > > year_count = vehicle_query.order_by( > '-common_vehicle__year__year') > .values('common_vehicle__year__year') > .annotate(count=Count('id') > ) > make_count = vehicle_query.order_by( > 'common_vehicle__series__model__manufacturer__manufacturer') > .values > ('common_vehicle__series__model__manufacturer__manufacturer') > .annotate(count=Count('id') > ) > style_count = vehicle_query.order_by( > 'common_vehicle__body_style__style') > .values('common_vehicle__body_style__style') > .annotate(count=Count('id') > ) > color_count = vehicle_query.order_by( > 'exterior_colour__exterior_colour') > .values('exterior_colour__exterior_colour') > .annotate(count=Count('id') > ) > > return render_to_response('vehicles.html', { > 'vehicle': vehicle, > 'make_count': make_count, > 'year_count': year_count, > 'style_count': style_count, > }) > > def make_filter(request, make): > vehicle_query = Vehicle.objects.filter( > common_vehicle__series__model__manufacturer__manufacturer=make) > .exclude(status__status='Incoming') > > vehicle_list = vehicle_query.order_by( > 'common_vehicle__series__model__manufacturer__manufacturer', > 'common_vehicle__series__model__model', > 'common_vehicle__year' > ) > > vehicle = paginate(request, vehicle_list) > > year_count = vehicle_query.order_by( > '-common_vehicle__year__year') > .values('common_vehicle__year__year') > .annotate(count=Count('id') > ) > make_count = vehicle_query.order_by( > 'common_vehicle__series__model__manufacturer__manufacturer') > .values > ('common_vehicle__series__model__manufacturer__manufacturer') > .annotate(count=Count('id') > ) > style_count = vehicle_query.order_by( > 'common_vehicle__body_style__style') > .values('common_vehicle__body_style__style') > .annotate(count=Count('id') > ) > color_count = vehicle_query.order_by( > 'exterior_colour__exterior_colour') > .values('exterior_colour__exterior_colour') > .annotate(count=Count('id') > ) > > return render_to_response('vehicles.html', { > 'vehicle': vehicle, > 'make_count': make_count, > 'year_count': year_count, > 'style_count': style_count, > }) > > def series_filter(request, model): > vehicle_query = Vehicle.objects.filter( > common_vehicle__series__series=model) > .exclude(status__status='Incoming') > > vehicle_list = vehicle_query.order_by( > 'common_vehicle__series__series', > 'common_vehicle__series__model__model', > 'common_vehicle__year') > > vehicle = paginate(request, vehicle_list) > > year_count = vehicle_query.order_by( > '-common_vehicle__year__year') > .values('common_vehicle__year__year') > .annotate(count=Count('id') > ) > make_count = vehicle_query.order_by( > 'common_vehicle__series__model__manufacturer__manufacturer') > .values > ('common_vehicle__series__model__manufacturer__manufacturer') > .annotate(count=Count('id') > ) > style_count = vehicle_query.order_by( > 'common_vehicle__body_style__style') > .values('common_vehicle__body_style__style') > .annotate(count=Count('id') > ) > color_count = vehicle_query.order_by( > 'exterior_colour__exterior_colour') > .values('exterior_colour__exterior_colour') > .annotate(count=Count('id') > ) > > return render_to_response('vehicles.html', { > 'vehicle': vehicle, > 'make_count': make_count, > 'year_count': year_count, > 'style_count': style_count, > }) > > def body_filter(request, body): > vehicle_query = Vehicle.objects.filter( > common_vehicle__body_style__style=body) > .exclude(status__status='Incoming') > > vehicle_list = vehicle_query.order_by( > 'common_vehicle__series__model__manufacturer__manufacturer', > 'common_vehicle__series__model__model', > 'common_vehicle__year' > ) > > vehicle = paginate(request, vehicle_list) > > year_count = vehicle_query.order_by( > '-common_vehicle__year__year') > .values('common_vehicle__year__year') > .annotate(count=Count('id') > ) > make_count = vehicle_query.order_by( > 'common_vehicle__series__model__manufacturer__manufacturer') > .values > ('common_vehicle__series__model__manufacturer__manufacturer') > .annotate(count=Count('id') > ) > style_count = vehicle_query.order_by( > 'common_vehicle__body_style__style') > .values('common_vehicle__body_style__style') > .annotate(count=Count('id') > ) > color_count = vehicle_query.order_by( > 'exterior_colour__exterior_colour') > .values('exterior_colour__exterior_colour') > .annotate(count=Count('id') > ) > > return render_to_response('vehicles.html', { > 'vehicle': vehicle, > 'make_count': make_count, > 'year_count': year_count, > 'style_count': style_count, > }) > > def color_filter(request, color): > vehicle_query = Vehicle.objects.filter( > exterior_colour__exterior_colour=color) > .exclude(status__status='Incoming') > > vehicle_list = vehicle_query.order_by( > 'common_vehicle__series__model__manufacturer__manufacturer', > 'common_vehicle__series__model__model', > 'common_vehicle__year') > > vehicle = paginate(request, vehicle_list) > > year_count = vehicle_query.order_by( > '-common_vehicle__year__year') > .values('common_vehicle__year__year') > .annotate(count=Count('id') > ) > make_count = vehicle_query.order_by( > 'common_vehicle__series__model__manufacturer__manufacturer') > .values > ('common_vehicle__series__model__manufacturer__manufacturer') > .annotate(count=Count('id') > ) > style_count = vehicle_query.order_by( > 'common_vehicle__body_style__style') > .values('common_vehicle__body_style__style') > .annotate(count=Count('id') > ) > color_count = vehicle_query.order_by( > 'exterior_colour__exterior_colour') > .values('exterior_colour__exterior_colour') > .annotate(count=Count('id') > ) > > return render_to_response('vehicles.html', { > 'vehicle': vehicle, > 'make_count': make_count, > 'year_count': year_count, > 'style_count': style_count, > }) -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/django-users?hl=.

