Соответствие любому шаблону с re_path в Django 3.0 - PullRequest
1 голос
/ 25 января 2020

Я изо всех сил пытаюсь понять, как использовать регулярное выражение с re_path в Django, чтобы соответствовать любому из набора шаблонов.

Я хочу соответствовать /bucket/, /buckets/, /pail/ или /pails для одного представления.

В моем основном файле URL-адресов у меня есть:

from bucket import urls as bucket_urls
urlpatterns = [
    re_path(r'^(?:bucket)s?/', include(bucket_urls))
]

и в модуле bucket.urls у меня есть:

urlpatterns = [
    path("new", views.BucketCreate.as_view(), name="create_bucket"),
    ...
    path('', BucketList.as_view(selection="recent"), name="buckets")
]

Это работает для /bucket/ и /buckets/, а также для /bucket/new/ и /buckets/new/, а также для других URL-адресов, выделенных из сегмента (ов).

Если я изменю его на '^(?:bucket|pail)s?/', ни один из URL-адресов ведра (-ей) или ведра (-ок) не сработает.

Если я изменю его на '^(bucket)s?/', ни одно из ведер (-ей) URL работают. Если я правильно понимаю, это потому, что () захватывает часть bucket, а ?: останавливает это?

пробуя это работает

urlpatterns = [
    re_path(r'^buckets?/', include(bucket_urls)),
    re_path(r'^pails?/', include(bucket_urls)),
]

но выдает это предупреждение: ?: (urls.W005) URL namespace 'bucket' isn't unique. You may not be able to reverse all URLs in this namespace

Стоит ли беспокоиться об этом предупреждении?

Есть ли какие-либо указатели на то, как я может сопоставить /bucket/, /buckets/, /pail/ или /pails/ с одним регулярным выражением, чтобы я не получил предупреждение?

Ответы [ 2 ]

1 голос
/ 25 января 2020

Измените выражение регулярного выражения следующим образом: r'^[(bucket|pail)s]+/'

from django.urls import include, re_path

urlpatterns = [
    ...,
    re_path(<b>r'^[(bucket|pail)s]+/', include(bucket_urls)</b>),
    ...
]

Чтобы устранить предупреждение (urls.W005), укажите пространство имен аргумент для include(...) (Django do c) функция

urlpatterns = [
    re_path(r'^buckets?/', include((bucket_urls, <b>namespace='buckets'</b>))),
    re_path(r'^pails?/', include((bucket_urls, <b>namespace='pails'</b>))),
]
1 голос
/ 25 января 2020

Вы должны просто указать разные пространства имен :

urlpatterns = [
    re_path(r'^buckets?/', include((bucket_urls, "buckets"))),
    re_path(r'^pails?/', include((bucket_urls, "pails"))),
]

Теперь вы должны добавить это пространство имен в качестве префикса, когда вы измените URL, например:

reverse( 'buckets:index')

В противном случае URL-адреса из ведер и ведер будут конфликтовать, и djna go не будет указывать, какой из них использовать, поэтому будет показано это предупреждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...