我有以下网址:
url(r'^(?P<college_name>\w+)/$', views.detail, name="detail"),
url(r'^(?P<photographer_username>\w+)/$', views.photographer, name="photographer"),
当我执行/college_name
网址时,它有效,但在输入website.com/johnsmith
之类的摄影师时,它只搜索第一个网址模式,然后停止。
如果我首先放置photographer
网址模式,它适用于摄影师而不适用于大学。
如何修复它以便适用于两者?
答案 0 :(得分:2)
您应区分两个网址模式,否则后者将始终被前者遮蔽。
可能在两者之前添加一个唯一的字符串:
url(r'^college/(?P<college_name>\w+)/$', views.detail, name="detail"),
url(r'^photographer/(?P<photographer_username>\w+)/$', views.photographer, name="photographer"),
答案 1 :(得分:2)
这怎么可能有效呢?正如你所说,正则表达式是相同的。那么Django怎么知道你的意思呢?它不能,所以它只选择第一个。
解决此问题的唯一方法是更改您的网址,使其不仅具有名称:例如“/ photographer /(?P \ w +)/ $”等。
答案 2 :(得分:1)
正如其他人所说,计算机无法确定选择哪个视图。最佳解决方案是拥有不同的路径,例如/photographer/
和/college/
。
如果您坚持两个视图都使用相同的网址方案,则需要告诉程序如何区分。
网址定义:
url(r'^(?P<photographer_or_college>\w+)/$', photographer_or_college_view, name="photographer_or_college")
查看选择其中一个:
def photographer_or_college_view(request, photographer_or_college):
try:
photographer = Photographer.objects.get(photographer_name=photographer_or_college)
except Photographer.DoesNotExist:
pass
else:
return photographer_view(request, photographer)
college = get_object_or_404(College, college_name=photographer_or_college)
return college_view(request, college)
不建议这样做,因为如果存在名称冲突,您将遇到问题。