带有列表的Django URL模式

时间:2011-06-06 13:50:28

标签: django

我有一个包含类别名称的列表,例如cats = ["tv", "movie", "theater"]。 我想写一个url模式来捕获只包含列表中某个项目的URL,例如:

url(r'^site/CATEGORY_NAME/$', 'mainsite.views.home'),

这样CATEGORY_NAME只能列出cat中的一个项目。 我怎么能这样做?

谢谢, 梅尔

3 个答案:

答案 0 :(得分:3)

您可以使用python的字符串join方法从列表中构建正则表达式的一部分,然后在URL模式中使用它。

例如:

cats = ["tv", "movie", "theater"]
cats_re = '(?:' + '|'.join(cats) + ')'

# ...then...
url(r'^site/' + cats_re + '/$', 'mainsite.views.home'),

在这种情况下,整个正则表达式看起来像:

url(r'^site/(?:tv|movie|theater)/$', 'mainsite.views.home'),

答案 1 :(得分:2)

由于URL匹配是基于正则表达式完成的,因此您可以使用正则表达式匹配多个字符串来执行此操作。 | (管道)字符在多个选项之间进行选择,即(a | b | c)将匹配a,b或c。

url(r'^site/(tv|movie|theatre)/$', 'mainsite.views.home'),

Python regular expression documentation非常好,值得一读。

答案 2 :(得分:0)

对于具有Python 3+的Django 2+,您可以使用以下代码:

from django.urls import re_path
from . import views

# List of category names defined here:
_entities = ["tv", "movie", "theater"]
re_entities = f'(?P<enertainment>{"|".join(_entities)})'

urlpatterns = [
    ...
    re_path(f'^{re_entities}/.../$', views.EntertainmentHandler.as_view()),
    ...
    ]