【问题标题】:django admin url is inconsistent with custom primary keydjango admin url 与自定义主键不一致
【发布时间】:2017-03-18 00:59:41
【问题描述】:

我发现在 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 分配的 url 不一致。 有谁知道是否有一个简单的解决方法? 改变模型将是一个巨大的痛苦。

有趣的是,我始终将“5F”自动放入路由中,因此如果我的主键是 44_66,则 url 将以 44_5F66 结尾。

【问题讨论】:

  • 不起作用是什么意思?是否引发异常或 404,?另外,您是否已验证数据库中确实存在具有该 ID 的对象?
  • 这意味着如果你把那个 url 放到浏览器中,url 路由器就会说这个页面不存在。这是一个问题,因为在这种情况下某些链接会失败...我的主键是 829_011

标签: django-admin


【解决方案1】:

为了避免这种不一致,我不得不更改架构,这是一项主要工作。 简而言之,不要在 django 中使用字符串主键。

【讨论】:

    【解决方案2】:

    这只是对 Django admin 中自定义主键如何工作的误解。由于您可以将任何字符(对 url 有效或无效)放入字符串主键中,因此 Django 必须对这些主键进行编码,以免它们混淆管理 url 解析器。此处对此进行了描述:https://github.com/django/django/blob/master/django/contrib/admin/utils.py#L63

    特殊字符 : /_ 是 django url 中的特殊字符,因此对于值为 44_66 的主键,Django 必须转义 _,这就是您看到 @987654327 的原因@ 在网址中。数据库中的主键仍然是44_66

    【讨论】:

    • 这对我来说没有意义,因为 829_011 编码为 829%5F011,但有效的 url 是 829_5F011。浏览器也会自动编码。此外,在 829_011 中看到了这种行为,但在 824_123 等另一个中没有看到。因为它的行为不一致,所以没有意义。
    • 就像它在我链接到的文档中所说的那样:“类似于 urllib.parse.quote(),只是引用略有不同,因此它不会被 Web 浏览器自动取消引用。 "所以它不是标准的 url 编码。我没有进行广泛的测试,所以我不知道是什么导致你的不一致。
    猜你喜欢
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2019-01-01
    • 2011-01-30
    • 2016-08-22
    • 2017-12-23
    相关资源
    最近更新 更多