2015-10-05 3 views
4

В следующем, если URL-адрес задан как, каков должен быть шаблон для uuid?Django urls uuid не работает

urls.py

url(r'^getbyempid/(?P<emp_id>[0-9]+)/(?P<factory_id>[0-9]+)$',views.empdetails) 

Doesnt работы,

http://10.0.3.79:8000/app1/getbyempid/1/b9caf199-26c2-4027-b39f-5d0693421506 

, но это работает

http://10.0.3.79:8000/app1/getbyempid/1/2 

ответ

20

Как и цифры 0-9, то UUID может также включать в себя цифру автофокусировки и дефис, так что вы могли бы должны изменить шаблон для

(?P<factory_id>[0-9a-f-]+) 

Вы могли бы иметь более строгое регулярное выражение, но это обычно не стоит Это. По вашему мнению вы можете сделать что-то вроде:

try: 
    factory = get_object_or_404(Factory, id=factory_id) 
except ValueError: 
    raise Http404 

, который будет обрабатывать недопустимые UUID, или UUID, которые не существуют в базе данных.

+1

Вы можете добавить 'попробовать ... кроме ValueError: поднять Http404()' для лечения входа, который является не трансформируемым в UUID так же, как недействительными uuids. – moooeeeep

+0

@moooeeeep хорошая точка - если вы используете 'UUIDField', то для строк, которые не конвертируются в uuid, требуется ловить' ValueError'. – Alasdair

+0

Я думаю, что 'UUIDField' выдает' ValidationError', если uuid искажен; просто чтобы быть более конкретным. – jhrr

1

Ваши шаблоны URL принимает только цифры, попробуйте это один:

url(r'^getbyempid/(?P<emp_id>[0-9a-z-]+)/(?P<factory_id>[0-9a-z-]+)$',views.empdetails) 
3

Просто завершить другие ответы, пожалуйста, обратите внимание, что Regex должен быть a-f не a-z, так:

urlpatterns = [ 
    url(r'^request/(?P<form_id>[0-9A-Fa-f-]+)', views.request_proxy) 
] 

что-то вроде выше, может быть самым точным ответом.

4

Поскольку Django 2.0 вы даже не нужно беспокоиться регулярное выражение для UUID и Int с новой функцией Джанго: Path Converters.

Ваш код будет элегантен:

from django.urls import path 
... 

urlpatterns = [ 
    ... 
    path('getbyempid/<int:emp_id>/<uuid:factory_id>', views.empdetails) 
]