【问题标题】:Edit/show Primary Key in Django Admin在 Django Admin 中编辑/显示主键
【发布时间】:2011-02-01 16:06:34
【问题描述】:

似乎 Django 隐藏了标记为 Primary Key 的字段,使其无法在 Django 管理界面中显示/编辑。

假设我想输入我可能想或不想指定主键的数据。我将如何在管理界面中显示主键,如何将其指定为可选?

【问题讨论】:

  • 您为什么希望能够编辑主键?是否有其他模型引用了您要编辑其主键的模型的主键?
  • 在某些情况下,主键已经指定。我正在处理的很多数据都是通过 XML 或 JSON 共享的,在生产环境中使用(所以我不能只是改变一些东西),而且我想在没有可选查找字段的情况下过日子.我宁愿只接受当前的密钥并填写它。虽然我可以在后端轻松完成此操作,但如果我无法调整 pk 进行测试,则填写一些测试数据很糟糕。不过,也许你有更好的方法。我可能只需要使用 provider_id 字段。

标签: django django-models django-admin


【解决方案1】:

要显示主键,默认情况下在数据库中的列名称为“id” - 使用“pk”

def __str__(self):
    return '{} - {} ({})'.format(self.pk, self.name, self.pcode)

【讨论】:

    【解决方案2】:

    The answer with the highest votes 对我不起作用。我需要一个吸气剂。

    class StudentEnrollmentInline(admin.TabularInline):
        model = Enrollment
        readonly_fields=('student_enrollment_id',)
    
        def student_enrollment_id(self, obj):
            return obj.id
    

    使用 django 1.11

    【讨论】:

      【解决方案3】:

      我还想在 Django 管理员中简单地显示“id”(主键),但不一定要编辑它。我刚刚将它添加到readonly_fields 列表中,它显示得很好。即:

      class StudentEnrollmentInline(admin.TabularInline):
          model = Enrollment
          readonly_fields=('id',)
      

      而如果我试图将它添加到“字段”列表中,Django 对我很不高兴,说该字段不存在......

      【讨论】:

      • 是的。 Django 将它们从编辑中隐藏起来,因为编辑具有未定义的语义
      【解决方案4】:

      django documentation里,有一句短句,不清楚:

      如果既不存在字段也不存在字段集选项,Django 将默认显示每个不是 AutoField 且具有可编辑=True 的字段,在单个字段集中,按照与模型中定义的字段相同的顺序。

      原因是,django 不允许您以任何方式编辑AutoField(这是正确的,因为它是一个自动增量值,不应该被编辑)。 @mnelson4 的回答是展示它的好方法。

      【讨论】:

        【解决方案5】:

        如果您在模型中明确指定主键字段(使用primary_key=True),您应该可以在管理员中对其进行编辑。

        对于通过./manage.py syncdb 创建的 Django 模型,会自动添加以下主键字段:

        id = models.AutoField(primary_key=True)
        

        如果您将其作为 IntegerField 主键显式更改(或添加)到您的模型中,您将能够直接使用管理员对其进行编辑:

        id = models.IntegerField(primary_key=True)
        

        但正如其他人指出的那样,这是一个潜在的雷区......

        【讨论】:

        • 你当然是对的。我选择了一个额外的字段,该字段是可选的,并在每次常规检查之前都调用该键。我想 Django 要么过滤任何 AutoKey 字段,要么只过滤掉名为 id 的键。有点令人失望,它不会让我强加不良做法。
        • 是的,它似乎过滤了 AutoField,这是有道理的。但是,如果您将其指定为 IntegerField,您将能够对其进行编辑。请参阅我的更新答案。
        【解决方案6】:

        拥有一个可选的主键是没有意义的。 PK 是自动增量的,在这种情况下不需要编辑它,或者它是手动指定的,在这种情况下总是需要的。

        为什么需要这个?

        【讨论】:

        • 我在上面评论了我的推理,它开始看起来像个坏主意。真的,我怎样才能在 django 的管理员中编辑主键。假设我是自虐狂。
        猜你喜欢
        • 2016-07-26
        • 2015-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-04
        • 2019-01-21
        • 2012-07-05
        • 2018-01-10
        相关资源
        最近更新 更多