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的新手所以请温柔:)任何帮助都会非常感激.
这些可能是有效的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调度程序的确切机制,但即使你只是逻辑地考虑它,它怎么能分配多个值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())
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)