2010-09-20 2 views
2

J'ai une application qui vous permet de filtrer les données via 3 champs. J'essaye d'écrire un RegEx dans mon urls.py qui peut capturer plusieurs combinaisons sans avoir à écrire chaque combinaison possible c'est sa propre URL.Comment capturer plusieurs arguments en utilisant un seul RegEx dans mon urls.py Django?

Voici mon urls.py:

#urls.py 
urlpatterns = patterns('', 
    # Uncomment the next line to enable the admin: 
    (r'^admin/', include(admin.site.urls)), 

    (r'(?P<key>\w*?)=(?P<value>\w*?)&|$', views.scriptFilter), 

J'ai testé l'expression rationnelle ci-dessus à pythonregex.com et il semble capturer autant de paires clé/valeur que je peux jeter. Cependant, lorsque j'essaie de l'essayer dans mon application, Django ne renvoie qu'un jeu de requête basé sur la première paire, et ignore les autres paires.

Par exemple, si j'entre ceci: http://MYSITE/feature=1&session=1&

Django retourne les données en fonction de fonction = 1 seulement et ne tient pas compte session = 1.

Voici mon views.py:

#views.py 
def scriptFilter(request, key, value): 
    if key == 'session': 
     sessionID = value 
     qs = models.Script.objects.filter(session=sessionID) 
    elif key == 'product': 
     productID = value 
     qs = models.Script.objects.filter(product=productID) 
    elif key == 'feature': 
     featureID = value 
     scriptFeature = models.Feature.objects.get(pk=featureID)  
     qs = models.Script.objects.filter(feature=scriptFeature) 
    else: 
     qs = models.Script.objects.all()   
    caseTotal = qs.aggregate(Sum('caseCount')) 
    scriptTotal = qs.aggregate(Count('subScriptName')) 
    featureTotal = qs.aggregate(Count('feature')) 
    return render_to_response('scripts.html', locals()) 

Je suis nouveau à Python Django & donc s'il vous plaît soyez gentil :) Toute aide serait vraiment apprécié.

Répondre

5

Ces peuvent être être des URL valides (pas tout à fait certain) mais elles ne sont certainement pas recommandées.

Si vous souhaitez autoriser les paramètres envoyés dans votre application à l'aide de paires valeur/clé (comme vous le faites ici), je suggère simplement d'utiliser des paramètres de requête. Voici une façon de mettre en œuvre que dans votre vue:

def scriptFilter(request, session=None, product=None, feature=None): 
    session = request.REQUEST.get('session',session) 
    product = request.REQUEST.get('product',session) 
    feature = request.REQUEST.get('feature',session) 
    if session 
     qs = models.Script.objects.filter(session=session) 
    elif product: 
     qs = models.Script.objects.filter(product=product) 
    elif feature: 
     qs = models.Script.objects.filter(feature=feature) 
    else: 
     qs = models.Script.objects.all()   
    caseTotal = qs.aggregate(Sum('caseCount')) 
    scriptTotal = qs.aggregate(Count('subScriptName')) 
    featureTotal = qs.aggregate(Count('feature')) 
    return render_to_response('scripts.html', locals()) 

Vous souhaitez ensuite appeler les URL comme

etc.

Notez que je suppose que lorsque vous dites que pythonregex a capturé tous les groupes, c'est probablement parce que vous regardiez la réponse .findall(). Je ne suis pas sûr de la mécanique exacte de l'expéditeur d'url de Django, mais même si vous y pensez logiquement, comment pourrait-il attribuer plus d'une valeur à key et value? Votre fonction scriptFilter ne gère même pas plusieurs valeurs envoyées Vous voulez vraiment lire:.

def scriptFilter(request, session=None, product=None, feature=None): 
    session = request.REQUEST.get('session',session) 
    product = request.REQUEST.get('product',session) 
    feature = request.REQUEST.get('feature',session) 
    qs = models.Script.objects.all()   

    if session 
     qs = qs.filter(session=session) 
    if product: 
     qs = qs.filter(product=product) 
    if feature: 
     qs = qs.filter(feature=feature) 
    caseTotal = qs.aggregate(Sum('caseCount')) 
    scriptTotal = qs.aggregate(Count('subScriptName')) 
    featureTotal = qs.aggregate(Count('feature')) 
    return render_to_response('scripts.html', locals()) 

Enfin, je devine que vous devez réécrire ces lignes ainsi: caseTotal = qs.aggregate (Somme ('caseCount')) = scriptTotal qs.aggregate (Count ('subScriptName')) = featureTotal qs.aggregate (Count ('caractéristique'))

La fonction aggregate crée un QuerySet avec les valeurs agrégées.Vous pouvez ainsi groupe ceux-ci dans un queryset:

script_totals = qs.aggregate(Sum('casecount'), Count('subscriptname'), Count('feature')) 

Dans le modèle, vous devez accéder à ces valeurs:

{{ script_totals.casecount__sum }} 
{{ script_totals.subscriptname__count }} 
{{ script_totals.feature__count }} 

Ce qui est un peu plus propre que

{{ caseTotal.casecount__sum }} 
{{ scriptTotal.subscriptname__count }} 
{{ featureTotal.feature__count }} 
+0

@jordan: pourquoi cette réponse est-elle marquée comme wiki communautaire? –

+0

Plus facile à modifier si des modifications doivent être apportées. Si ce n'est pas ce que wiki communautaire est, désolé et n'hésitez pas (celui qui a ce pouvoir) de le changer. –

+0

Aucun problème avec votre choix, juste curieux :) –

1

Jordanie ,

Merci d'avoir pris le temps de regarder & répondre à ma question. J'apprécie les conseils. Dans le cas où quelqu'un d'autre trouve cette page, j'ai trouvé la solution spécifiquement pour ma question RegEx à l'adresse ci-dessous:

Django: Arbitrary number of unnamed urls.py parameters

Merci encore!

Questions connexes