2009-11-24 5 views
1

Je voudrais configurer un filtre dans mon application ... J'aimerais que mes filtres soient effectués par incréments, un peu comme ce qui est en cours d'exécution à this site. Jusqu'à présent, mes vues de filtre sont séparées (existe-t-il un moyen de combiner la logique de filtrage en une vue?) Et je suppose que je vais avoir besoin d'un moyen de sauvegarder le filtre choisi (éventuellement des sessions ... mais je ne suis pas sûr comment faire cela). Mon code est comme ci-dessous:Configurer un filtre dans django

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, 'color_count': color_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')) 
series_count = vehicle_query.order_by('common_vehicle__series__series').values('common_vehicle__series__series').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, 'series_count': series_count, 'year_count': year_count, 'style_count': style_count, 'color_count': color_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, 'color_count': color_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, 'color_count': color_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, 'color_count': color_count,}) 

Répondre

1

Vous écrivez un gestionnaire. De votre exemple, il faut au moins une méthode pour vehicle_query, une méthode pour .annotate(count=Count('id')) et peut-être quelques-unes pour les order_by() s répétées.

Si vous avez besoin des méthodes pour nicher, de sorte que vous pouvez faire vehicle_query(year).with_counts() ainsi que with_counts().vehicle_query(year), vous devez faire votre propre QuerySet aussi, qui est: inherit de QuerySet, ajoutez les méthodes là, utilisez que queryset dans votre gestionnaire et mappez les méthodes du gestionnaire aux méthodes du jeu de requête.

from django.db import models 
from django.db.models.query import QuerySet 

class VehicleQuerySet(QuerySet): 
    def vehicle_query(self, year): 
     return self.filter(common_vehicle__year__year__exact=year).exclude(status__status='Incoming') 

class VehicleManager(models.Manager): 
    def get_query_set(self): 
     return VehicleQuerySet(self.model) 

    def vehicle_query(self, year): 
     return self.get_query_set().vehicle_query(year) 

class WhateverModel(models.Model): 
    ... 
    objects = models.Manager() # keeping the default manager 
    smart_objects = VehicleManager() # additional manager 

Ensuite, dans votre point de vue:

vehicle_query = Vehicle.smart_objects.vehicle_query(year) 
+0

Y a-t-il une autre façon de faire ça ... peut-être en utilisant des sessions? Peut-être que c'est juste moi mais je ne peux pas commencer à comprendre ce peu de code – Stephen

+0

Ceci est un moyen très commun. suivez le lien d'ozan pour en apprendre davantage sur les gestionnaires. – vikingosegundo

+0

BTW, cela va-t-il préserver mes valeurs entre les requêtes? – Stephen

2

Ce genre de logique est ce que managers sont pour. Même si vous décidez de ne pas utiliser les gestionnaires, vous devriez utiliser le code commun d'une autre façon que vous connaissez. (Préférez la programmation procédurale? Écrivez une fonction d'utilité Familiarisez-vous avec la POO Créez des vues de classes appelables qui héritent d'une classe qui contient la logique de filtrage.) Si vous vous trouvez copier et coller du code comme ceci, c'est un signe que vous êtes va avoir des ennuis avant trop longtemps.

+0

alors comment exactement ce que je vais sur la résolution de mon problème? Je ne suis pas très bon avec Django ... c'est ma première application BTW – Stephen