1 всегда не совпадает в регулярном выражении Django re_path

Я пытаюсь создать динамический путь, который принимает либо null, либо положительное целое число.

Например:

http://127.0.0.1:8000/my_url/

http://127.0.0.1:8000/my_url/23

в url.py:

from django.urls import path, re_path
urlpatterns = [
    re_path(r'^my_url/(\s*|[0-9]{0,})$', views.my_function, name='my_function'),
]

в view.py:

def my_function(request, my_id):
    if my_id == '':
        #Do somthing
    else:
        #Do another somthing
      

Странная вещь:

в моем тесте были получены следующие результаты:

http://127.0.0.1:8000/my_url/

http://127.0.0.1:8000/my_url/2

http://127.0.0.1:8000/my_url/10

Единственное, что не удалось (то есть возврат 404, url не найден) это:

http://127.0.0.1:8000/my_url/1

Почему не совпадает только '1'? Является ли 1 специально обработанной в функции re_path?

В обновлении к вашему вопросу объясняется, что это, вероятно, какой-то механизм кэширования в браузере.

Однако я бы посоветовал разделить это на два paths: один с параметром <int:my_int>, а другой без такого параметра. Они оба могут вызывать одно и то же представление:

from django.urls import path

urlpatterns = [
    path('my_url/', views.my_function, name='my_function'),
    path('my_url/<int:my_id>/', views.my_function,  name='my_function')
]

В представлении вы делаете my_id необязательным параметром, который разрешается в None в случае, если оно не вызывается с этим параметром:

def my_function(request, my_id=None):
    if my_id is None:
        # do something
    else:
        # do something else
Вернуться на верх