在 Django 中命名组 URL 中匹配正则表达式的顺序



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

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

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

另一种选择是具有单个detailURL 模式和视图。

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

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

相关内容

  • 没有找到相关文章

最新更新