如何在我的Django urls.py中使用单个RegEx捕获多个参数?

Ash*_*ton 2 regex django django-urls django-views

我有一个应用程序,允许您通过3个字段过滤数据.我正在尝试在我的urls.py中编写一个RegEx,它可以捕获多个组合,而不必将每个可能的组合写出它自己的URL.

这是我的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),
Run Code Online (Sandbox Code Playgroud)

我在pythonregex.com上测试了上面的RegEx,它似乎捕获了尽可能多的键/值对.但是,当我在我的应用程序中测试它时,Django只返回基于第一对的查询集,并忽略其他对.

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

Django仅返回基于feature = 1的数据,并忽略session = 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())
Run Code Online (Sandbox Code Playgroud)

我是Python和Django的新手所以请温柔:)任何帮助都会非常感激.

Jor*_*ter 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())
Run Code Online (Sandbox Code Playgroud)

然后,您将URL称为

等等

请注意,我假设你说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())
Run Code Online (Sandbox Code Playgroud)

最后,我猜你也应该重写这些行:caseTotal = qs.aggregate(Sum('caseCount'))scriptTotal = qs.aggregate(Count('subScriptName'))featureTotal = qs.aggregate(Count('feature) "))

aggregate函数使用聚合值创建QuerySet.您也可以将这些组合成一个查询集:

    script_totals = qs.aggregate(Sum('casecount'), Count('subscriptname'), Count('feature'))
Run Code Online (Sandbox Code Playgroud)

在模板中,您可以访问以下值:

{{ script_totals.casecount__sum }}
{{ script_totals.subscriptname__count }}
{{ script_totals.feature__count }}
Run Code Online (Sandbox Code Playgroud)

哪个比...更清洁

{{ caseTotal.casecount__sum }}
{{ scriptTotal.subscriptname__count }}
{{ featureTotal.feature__count }}
Run Code Online (Sandbox Code Playgroud)