【问题标题】:order of matching regex in named group urls in djangodjango中命名组url中匹配正则表达式的顺序
【发布时间】:2019-01-18 08:24:09
【问题描述】:

我正在用 django 制作一个博客网站。我正在使用 slug 来识别特定的文章。我正在为 3 个不同的领域制作这些博客,即草图、蛋糕和兰戈利斯。但这里的问题是,这三个网址的 slug 正则表达式将变得相同。为了方便起见,我还命名了这些 url,但不知何故无法控制匹配这三个的顺序。它适用于首先写入 url 文件中的 url 的命名组正则表达式。我在下面提供了必要的文件。我的主要网站名称是“网站”,应用程序名称是“艺术”。对于下面给出的命名组 URL 的顺序,错误是“Rangoli 匹配查询不存在”。所以只有第一个命名的组 url 有效。谁能帮我解决这个问题。提前致谢!

艺术/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'),

艺术/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 %}

【问题讨论】:

    标签: regex django models slug modelform


    【解决方案1】:

    您不能多次使用同一个正则表达式r'^(?P&lt;slug&gt;[\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 视图必须从数据库中获取正确的对象并呈现适当的模板。

    【讨论】:

    • 但我认为这就是我们使用命名 urls 的原因。我从 list_sketches.html 传递带有 slug 值的特定 url 名称。
    • 命名的 url 模式允许 gld 将 {% url 'art:sketches_detail' slug=each.slug %} 转换为 /your-slug/。但是,一旦您在呈现的模板中单击指向 /your-slug/ 的链接,服务器就无法知道使用了哪个(如果有)url 模式来反转它,因此 Django 总是在第一个匹配的模式处停止。
    猜你喜欢
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 2016-02-11
    • 2011-08-17
    • 2017-09-12
    • 2014-01-31
    • 1970-01-01
    相关资源
    最近更新 更多