2016-04-13 19 views
5

Tôi gặp lỗi này khi tôi cố chuyển thuộc tính UUID thành thông số url.UUID ('...') không phải là JSON có thể nối tiếp

urlpatterns = [ 
    url(r'^historia-clinica/(?P<uuid>[W\d\-]+)/$', ClinicHistoryDetail.as_view(), name='...'), 
] 

views.py

class ClinicHistoryDetail(...): 
    ... 
    my_object = MyModel.objects.create(...) 
    ... 
    return redirect(reverse('namespace:name', kwargs={'uuid' : my_object.id})) 

model.py

class MyModel(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    ... 

Bất kỳ đề nghị?

+0

Sẽ tốt hơn nếu bạn có thể chỉ cho chúng tôi cách bạn vượt qua và cũng như những gì 'ClinicHistoryDetail' đang thực hiện. – ozgur

Trả lời

0

Để sử dụng UUID trong một URL như vậy, bạn nên vượt qua nó như là một chuỗi:

return redirect(reverse('namespace:name', kwargs={'uuid' : str(object.id)})) 

FYI - có vẻ như WIMs Câu trả lời là kỹ lưỡng hơn một chút. Regex của bạn chắc chắn nên được thắt chặt. Nếu bạn kết thúc bằng cách sử dụng biểu diễn chuỗi của slug, bạn sẽ muốn có một regex như thế này: [A-Za-z0-9\-]+ cho phép chữ và số và dấu gạch nối.

+0

Có thể bạn vẫn gặp lỗi vì không có UUID hoặc hex là một đối tượng có thể tuần tự hóa được. Bạn nên làm cho họ một chuỗi trong từ điển kwargs của bạn 'str (object.id)' hoặc 'str (object.id.hex)' Sau đó, chỉ cần đảm bảo rằng regex của bạn phù hợp với tùy chọn mà bạn chọn. Nếu đó là hex, sử dụng '[0-9a-f] {32}'. Nếu không, hãy sử dụng '[A-Za-z0-9 \ -] +' –

0

Trong dòng chuyển hướng, thay đổi kwargs từ:

kwargs={'uuid' : object.id} 

Để này

kwargs={'uuid' : object.id.hex} 

Và sau đó sử dụng một regex tốt hơn trong URLPATTERN:

r'[0-9a-f]{32}' 
+0

Tôi vẫn gặp lỗi – DJeanCar

3

Có một lỗi vé trên Django liên quan đến vấn đề này tuy nhiên một tùy chỉnh được gọi là 'bộ mã hóa phức tạp' bởi tài liệu python có thể giúp bạn.

import json 
from uuid import UUID 


class UUIDEncoder(json.JSONEncoder): 
    def default(self, obj): 
     if isinstance(obj, UUID): 
      # if the obj is uuid, we simply return the value of uuid 
      return obj.hex 
     return json.JSONEncoder.default(self, obj) 

Bây giờ nếu chúng ta đã làm một cái gì đó như thế này

json.dumps(my_object, cls=UUIDEncoder) 

lĩnh vực uuid của bạn nên được mã hóa.

Các vấn đề liên quan