Django正则表达了许多slu ..

时间:2017-03-30 12:26:53

标签: python regex django

我在我的网址中有正则表达式,它接受传递一个slug到我的视图,例如:

  

127.0.0.1/cart/product_slug1

但我需要一个接受传递一个或多个slu的正则表达式,例如:

  

127.0.0.1/cart/product_slug1/product_slug2/product_slug3 /.../ product_slugN

urls.py

from django.conf.urls import url

from . import views

urlpatterns = [
url(
    r'^cart/add/(?P<slug>[\w_-]+)/$', views.create_cartitem,
    name='create_cartitem'
),

可能发送很多slu ??

1 个答案:

答案 0 :(得分:0)

[更新] :您似乎无法做到这一点。相反,您可以放置​​一个捕获所有模式并捕获整个URL。然后在views内,您可以按/拆分并获取所需的参数。像这样:

 urlpatterns = [
    url(
        r'^cart/add/(?P<slugs>[\w_/-]+)/$', views.create_cartitem, name='create_cartitem'
    ),

然后在views中,执行此操作:

def my_view(request, slugs):
    slugs = slugs.split('/')
    # now slugs is a list of strings

但请注意,由于cart/add/h/e/l/l/ocart/add/hell//o//to/you都有效,因此容易出错。

- 老答案 -

当然可以,但你不能使用both named captured parameters with unnamed ones

所以,将urls.py更改为:

urlpatterns = [
    url(
        r'^cart/add/([\w_-]+)/([\w_-]+/)*$', views.create_cartitem, name='create_cartitem'
    ),

在你的views.py内,而不是kwargs(就像你已经拥有的slug),你必须使用args(位置参数,现在你已经拥有了slug s列表。像这样:

def my_view(request, *args):
    for arg in args:
        print(arg)

现在,如果您在127.0.0.1:8000/cart/add/argv/argvv/argvvv/内输入views,则会将其作为列表['argv', 'argvv', 'argvvv']获取。