django中命名组url中匹配正则表达式的顺序

order of matching regex in named group urls in django

我正在用 django 制作一个博客网站。我正在使用 slug 来识别特定文章。我正在为 3 个不同的领域制作这些博客,即素描、蛋糕和 rangolis。但这里的问题是,这三个中 urls 的 slug 的正则表达式变得相同。为了方便起见,我也将这些命名为 url,但不知何故无法控制匹配这三个的顺序。它适用于首先写入 url 文件的 url 的命名组正则表达式。我在下面提供了必要的文件。我的主要网站名称是'website',应用程序名称是'art'。对于下面给出的命名组 urls 的顺序,错误是 'Rangoli matching query does not exist'。所以只有第一个命名组 url 正在工作。谁能帮我解决这个问题。提前致谢!

art/urls.py

url(r'list_sketches.html$', views.sketches_list, name='sketches_list'),

url(r'list_rangolis.html$', views.rangolis_list, name='rangolis_list'),

url(r'list_cakes.html$', views.cakes_list, name='cakes_list'),

url(r'^(?P<slug>[\w-]+)/$', views.rangolis_detail, name='rangolis_detail'),

url(r'^(?P<slug>[\w-]+)/$', views.sketches_detail, name='sketches_detail'),

url(r'^(?P<slug>[\w-]+)/$', views.cakes_detail, name='cakes_detail'),

art/views.py

def sketches_list(request):

    sketches = Sketch.objects.all().order_by('-date') 
    return render(request, 'art/list_sketches.html', {'sketches':sketches}) 

def sketches_detail(request, slug):

    sketch = Sketch.objects.get(slug=slug)
    return render(request, 'art/detail_sketches.html', {'each':sketch})

list_sketches.html

{% extends "me/base_layout.html" %}

{% block content %}

    {% for each in sketches %}

        <h1><a href="{% url 'art:sketches_detail' slug=each.slug %}"> {{ each.title }}</a> </h1>
        <p>{{ each.date}}</p>
        <p>{{ each.snippet }}</p>
    {% endfor %}

{% endblock %}

detail_sketches.html

{% extends "me/base_layout.html" %}

{% block content %}


    <h1> {{ each.title }} </h1>
    <p>{{ each.date}}</p>
    <img src="{{ each.sketch.url}}"/>
    <p>{{ each.body }}</p>
{% endblock %}

您不能多次使用相同的正则表达式 r'^(?P<slug>[\w-]+)/$'。 Django URL 解析器在匹配后立即停止,因此它将始终调用 rangolis_detail 视图。

一种选择是更改正则表达式,以免它们发生冲突,例如:

url(r'^rangolis/(?P<slug>[\w-]+)/$', views.rangolis_detail, name='rangolis_detail'),
url(r'^sketches/(?P<slug>[\w-]+)/$', views.sketches_detail, name='sketches_detail'),
url(r'^cakes/(?P<slug>[\w-]+)/$', views.cakes_detail, name='cakes_detail'),

另一种选择是使用单一 detail URL 模式和视图。

url(r'^(?P<slug>[\w-]+)/$', views.detail, name='detail'),

然后您的 detail 视图必须从数据库中获取正确的对象并呈现适当的模板。