2015-10-05 86 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) 
]