当我尝试将UUID属性传递给url参数时,我收到此错误。
/users/invitation
views.py
urlpatterns = [
url(r'^historia-clinica/(?P<uuid>[W\d\-]+)/$', ClinicHistoryDetail.as_view(), name='...'),
]
model.py
class ClinicHistoryDetail(...):
...
my_object = MyModel.objects.create(...)
...
return redirect(reverse('namespace:name', kwargs={'uuid' : my_object.id}))
有什么建议吗?
答案 0 :(得分:19)
Django上有一个关于这个问题的错误票,但是python docs定制的所谓“复杂编码器”可以帮到你。
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)
现在,如果我们做了类似的事情
json.dumps(my_object, cls=UUIDEncoder)
你的uuid字段应该被编码。
答案 1 :(得分:3)
将 UUID 转换为 str。
uuid_str = str(uuid_item)
答案 2 :(得分:2)
我为此使用了转换功能,它简单干净。
<h2>Tabs</h2>
<p>Click on the buttons inside the tabbed menu:</p>
<div class="tab">
<button class="tablinks" >London</button>
<button class="tablinks">Paris</button>
<button class="tablinks">Tokyo</button>
</div>
<div id="London" class="tabcontent">
<h3>London</h3>
<p>London is the capital city of England.</p>
</div>
<div id="Paris" class="tabcontent">
<h3>Paris</h3>
<p>Paris is the capital of France.</p>
</div>
<div id="Tokyo" class="tabcontent">
<h3>Tokyo</h3>
<p>Tokyo is the capital of Japan.</p>
</div>
答案 3 :(得分:1)
要在类似的URL中使用UUID,您应该将其作为字符串传递:
return redirect(reverse('namespace:name', kwargs={'uuid' : str(object.id)}))
仅供参考 - 看起来WIM的答案更为彻底。你的正则表达当然应该收紧。如果你最终使用了slug的字符串表示,那么你需要一个像这样的正则表达式:[A-Za-z0-9\-]+
它允许使用字母数字和连字符。
答案 4 :(得分:0)
我在数据库模型中的UUID字段也遇到了同样的问题,我想打印出来进行调试。我发现pprint()
模块中的pprint
函数可以处理此问题。您还可以给它一个indent
参数,以获得与从json.dumps()
获得的缩进类型相同的输出
https://docs.python.org/3/library/pprint.html#pprint.pprint
示例:
>>> import uuid
>>> import pprint
>>> import json
>>> x = uuid.UUID('12345678123456781234567812345678')
>>> x
UUID('12345678-1234-5678-1234-567812345678')
>>> print(x)
12345678-1234-5678-1234-567812345678
>>> json.dumps(x)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
...
...
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: UUID('12345678-1234-5678-1234-567812345678') is not JSON serializable
>>> pprint.pprint(x)
UUID('12345678-1234-5678-1234-567812345678')