2015-10-05 48 views
4

在下面,如果url被设置为,uuid的模式应该是什么?Django的网站uuid不工作

urls.py

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

不工作,

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 

它将处理数据库中不存在的无效uuids或uuids。

+1

您可能要添加一个'尝试...除了ValueError异常:提高HTTP404()'为了治疗投入是不能转换的UUID一样无效的uuids。 – moooeeeep

+0

@moooeeeep好点 - 如果您使用的是'UUIDField',那么对于不能转换为uuid的字符串,需要捕获'ValueError'。 – Alasdair

+0

我认为如果uuid格式不正确,'UUIDField'会抛出'ValidationError';只是为了更具体一点。 – jhrr

1

您的网址模式正在唯一号码,试试这个:

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

只是为了完成其他的答案,请注意,正则表达式应该是a-fa-z,所以:

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

像上面可能是最准确的答案。

4

由于Django的2.0,你甚至都不需要担心的正则表达式UUIDINT新的Django功能:Path Converters

您的代码将是优雅:

from django.urls import path 
... 

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