2010-09-20 34 views
2

我有一個應用程序,允許您通過3個字段過濾數據。我正在嘗試在我的urls.py中編寫一個RegEx,它可以捕獲多個組合,而不必將每個可能的組合寫入它自己的URL。如何在Django的urls.py中使用一個RegEx捕獲多個參數?

這裏是我的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), 

我測試了上述正則表達式在pythonregex.com,它似乎捕捉到儘可能多的鍵/值對,因爲我可以扔了。但是,當我測試在我的應用程序中嘗試它時,Django僅返回基於第一對的查詢集,並忽略其他對。

例如,如果我輸入: http://MYSITE/feature=1&session=1&

基於特徵的Django返回數據= 1只,並忽略會話= 1。

這裏是我的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()) 

我是新來的Python & Django的,所以請溫柔:)任何幫助將非常感激。

回答

5

這些可能是有效的URL(不完全確定),但他們肯定不推薦。

如果你想允許使用鍵值對(如你在這裏所做的)發送到你的應用程序的參數,我會建議使用查詢參數。下面就來實現,在您的視圖方式:

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()) 

你會再調用網址作爲

請注意,假設您說pythonregex捕獲了所有組,那可能是因爲您正在查看.findall()響應。我不確定Django的url調度器的確切機制,但即使您只是在邏輯上考慮它,它如何將多個值分配給keyvalue?您scriptFilter功能甚至不處理多個值被送到你真的想要閱讀:

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()) 

最後,我猜你應該重寫這些行,以及: caseTotal = qs.aggregate(總和( 'caseCount')) scriptTotal = qs.aggregate(計數( 'subScriptName')) featureTotal = qs.aggregate(計數( '特徵'))

aggregate該函數創建一個查詢集與所述聚合值。你不妨組到一條查詢集:

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

在模板中,你會訪問這些值:

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

這比

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

@jordan:任何理由將此答案標記爲社區wiki? – 2010-09-20 19:18:38

+0

如果需要進行更改,人們可以更輕鬆地進行編輯。如果這不是什麼社區維基是爲了,對不起,並感到自由(誰擁有這種權力)將其改回。 – 2010-09-20 19:56:29

+0

沒有任何問題與你的選擇,只是好奇:) – 2010-09-20 19:59:19

相關問題