我在django admin中使用自定义主键时发现,有时分配的url与使用的ID不一致。 当主键为 829_011
时class Run(models.Model):
id = models.CharField(max_length=50, primary_key=True)
This url works:
https://localhost/admin/myapp/run/829_5F011/
but this does not - 404 error:
https://localhost/admin/myapp/run/829_011/
我不知道为什么django会分配一个不一致的网址。 有谁知道这是否有一个简单的解决方案? 改变模型将是一个巨大的痛苦。
有趣的是,我一直得到" 5F"自动输入路由,所以如果我的主键是44_66,则url将以44_5F66结束。
答案 0 :(得分:0)
我不得不改变架构,这是避免这种不一致的主要工作。 简而言之,不要在django中使用字符串主键。
答案 1 :(得分:0)
这只是对Django管理中自定义主键如何工作的误解。由于您可以将任何对URL有效或无效的字符放入字符串主键中,因此Django必须对这些主键进行编码,以便它们不会混淆管理URL解析器。这在此处描述:https://github.com/django/django/blob/master/django/contrib/admin/utils.py#L63
特殊字符:
/
和_
是django网址中的特殊字符,因此对于值为44_66
的主键,Django必须转义{{1}这就是你在网址中看到_
的原因。数据库中的主键仍为44_5F66
。