如何在我的 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 调度程序的确切机制,但即使您只是从逻辑上考虑它,它如何为 key
和 value
分配多个值?您的 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 在我的主 url.py 中包含应用程序 url