如何在我的 Django urls.py 中使用单个正则表达式捕获多个参数?

Posted

技术标签:

【中文标题】如何在我的 Django urls.py 中使用单个正则表达式捕获多个参数?【英文标题】:How to capture multiple arguments using a single RegEx in my Django urls.py? 【发布时间】:2011-04-14 20:07:29 【问题描述】:

我有一个应用程序允许您通过 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),

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

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

Django 仅返回基于 feature=1 的数据,而忽略 session=1。

这是我的观点.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 的新手,所以请保持温和 :) 任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

这些可能是有效的网址(不完全确定),但绝对不推荐使用。

如果您想允许使用键值对将参数发送到您的应用程序(就像您在此处所做的那样),我建议您只使用查询参数。在您看来,这是一种实现方式:

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

然后您将 URL 称为

http://example.com/myapp?session=X http://example.com/myapp?product=X http://example.com/myapp?session=X&feature=Y

等等

请注意,我假设当您说 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(Sum('caseCount')) scriptTotal = qs.aggregate(Count('subScriptName')) featureTotal = qs.aggregate(Count('feature'))

aggregate 函数使用聚合值创建一个 QuerySet。您也可以将它们分组到一个查询集中:

    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 

【讨论】:

@jordan:为什么这个答案被标记为社区维基? 如果需要更改,人们更容易对其进行编辑。如果这不是社区 wiki 的用途,请原谅并随时(拥有此权力的人)将其改回。 您的选择没有任何问题,只是好奇:) @Jordan:这是一个很好的答案,但是将其标记为 wiki 您将不会得到任何积分。不幸的是,您无法取消设置。 我想我主要担心可能存在一些需要修复的错误。我想将来我总是可以只回复 cmets。

以上是关于如何在我的 Django urls.py 中使用单个正则表达式捕获多个参数?的主要内容,如果未能解决你的问题,请参考以下文章

DJango 中 URLS.py 中的无效语法错误

Django 在我的主 url.py 中包含应用程序 url

django 在 urls.py 中重定向

如何在 Django tests.py 文件中的每次测试后重新评估我的 urls.py 文件?

如何在模板中使用 django-summernote

刷新 django 中的 urls.py 缓存