django admin url与自定义主键不一致

时间:2017-03-18 00:59:41

标签: django-admin

我在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结束。

2 个答案:

答案 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