2009-11-12 7 views
0

Je suis en train de mettre en place une requête de filtre dans un de mes vues ... essentiellement mon code ressemble comme ci-dessous:Django filtrage Problème

def inventory(request): 
    vehicle = Vehicle.objects.all().exclude(status__status='Incoming').order_by('common_vehicle__series__model__manufacturer__manufacturer', 'common_vehicle__series__model__model', 'common_vehicle__year') 

    year_count = Vehicle.objects.exclude(status__status='Incoming').order_by('-common_vehicle__year__year').values('common_vehicle__year__year').annotate(count=Count('id')) 
    make_count = Vehicle.objects.exclude(status__status='Incoming').order_by('common_vehicle__series__model__manufacturer__manufacturer').values('common_vehicle__series__model__manufacturer__manufacturer').annotate(count=Count('id')) 

    return render_to_response('vehicles.html', {'vehicle': vehicle, 'make_count': make_count, 'year_count': year_count,}) 

def year_filter(request, year): 
    vehicle = Vehicle.objects.filter(common_vehicle__year__year=year) 

    return render_to_response('filter.html', {'vehicle':vehicle,}) 

def make_filter(request, make): 
    vehicle = Vehicle.objects.filter(common_vehicle__series__model__manufacturer__manufacturer=make).exclude(status__status='Incoming') 

    return render_to_response('filter.html', {'vehicle':vehicle,}) 

Jusqu'à présent, lorsque je tente un des deux points de vue, Je ne reçois que l'ensemble de la requête de la première vue, c'est-à-dire l'inventaire. Le fichier URLconf se présente comme ci-dessous:

(r'^inventory/year/(?P<year>d{4})/?$', 'app.vehicles.views.year_filter'), 
(r'^inventory/make/(?P<make>)/', 'app.vehicles.views.make_filter'), 

Répondre

1

Il me semble qu'il vous manque une expression.

(r'^inventory/year/(?P<year>d{4})/?$', 'app.vehicles.views.year_filter'), 
(r'^inventory/make/(?P<make>)/', 'app.vehicles.views.make_filter'), 

<year> correspond à une série de 4 chiffres, qu'est-ce <make> match?

(r'^inventory/make/(?P<make>[-\w]+)/', 'app.vehicles.views.make_filter'), 

Cela correspond à quelque chose à la variable make. Heureux de savoir si je me trompe!

+0

Je oublierais tout sur le bit correspondant ... merci bennylope. Cela me donne cependant un queryset vierge ... donc je ne sais pas ce qui pourrait être le problème –

+0

mon mauvais ... juste vu mon erreur ... maintenant le filtre de make fonctionne. –

0

Il semble que dans votre URLconf, au-dessus de ceux que vous avez déjà mentionnés, vous pourriez avoir une cartographie qui l'emporte sur ceux ci-dessous - disent comme -

(r'^inventory/', 'app.vehicles.views.inventory'), 

qui provoque tous les appels dans l'inventaire pour atteindre l'inventaire de la méthode.

Ceci est dû au fait que Django le parcourt en série. Toute URL qui lui correspond en premier l'atteindra. Pour y remédier, vous réorganisez les urls de la manière suivante -

(r'^inventory/year/(?P<year>d{4})/?$', 'app.vehicles.views.year_filter'), 
(r'^inventory/make/(?P<make>)/', 'app.vehicles.views.make_filter'), 
(r'^inventory/', 'app.vehicles.views.inventory'), 
+0

J'ai eu une cartographie comme avant ceux de marque et l'année ... Je l'ai mis à jour le URLconf comme vous l'avez spécifié, mais il continue d'utiliser la méthode d'inventaire –

+0

La façon dont je résoudrais le problème est la suivante: 1. Faites une sauvegarde de urlconf. 2. Supprimez toutes les lignes d'urlconf qui peuvent atteindre views.inventory 3. Essayez d'obtenir les URL restantes pour atteindre year_filter et make_filter. 4. Une fois terminé, remettez les rebords un par un, dans les bonnes positions, jusqu'à ce que tout soit correct. – Koran

0

Coran est sur la bonne voie. Essayez d'avoir dans votre URLconf:

(r'^inventory/$', 'app.vehicles.views.inventory'), 
(r'^inventory/year/(?P<year>d{4})/?$', 'app.vehicles.views.year_filter'), 
(r'^inventory/make/(?P<make>)/', 'app.vehicles.views.make_filter'), 

Le regex r^inventaire/$ »correspond strictement juste que, rien passé le '/'. Cela devrait amener les autres URL à correspondre aux vues appropriées.

+0

OK ... au moins maintenant je pense que le problème est les deux dernières regex ... Je reçois 404 pour eux maintenant –

0

d {4} correspond toujours exactement à quatre s, dddd. Est-ce que c'est ce que tu veux?

(r'^inventory/year/(?P<year>d{4})/?$', 'app.vehicles.views.year_filter'), 

Je soupçonne que vous devez échapper d avec \, comparer:

(r'^inventory/year/(?P<year>\d{4})/?$', 'app.vehicles.views.year_filter'), 
+0

c'est ce que je veux ... J'ai cependant compris que j'avais omis la partie qui s'échappe ... donc j'ai (r '^ inventaire/année/(? P \ d {4})/$ ',' app.vehicles.views.year_filter '), Ceci cependant me donne: Relatif Le champs a une correspondance invalide: année –

+0

J'ai compris ...l'ajout de __exact à ma requête year_count a corrigé l'erreur. –

Questions connexes