Django - 具有相同正则表达式但具有不同变量和视图的2个URL

时间:2017-03-11 23:01:34

标签: python django python-2.7 url django-urls

我有以下网址:

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网址模式,它适用于摄影师而不适用于大学。

如何修复它以便适用于两者?

3 个答案:

答案 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)

不建议这样做,因为如果存在名称冲突,您将遇到问题。