【问题标题】:Django admin: How to display a field that is marked as editable=False' in the model?Django admin:如何在模型中显示标记为 editable=False' 的字段?
【发布时间】:2011-04-27 10:16:32
【问题描述】:

即使模型中的字段标记为'editable=False',我也希望管理页面显示它。目前它完全隐藏了该领域..如何实现?

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    更新

    如果您希望该字段在 Admin 中可编辑但在其他任何地方不可编辑,此解决方案非常有用。如果您想让该字段始终保持不可编辑,那么@Till Backhaus' answer 是更好的选择。

    原答案

    一种方法是在管理员中使用自定义ModelForm。此表单可以覆盖必填字段以使其可编辑。因此,除了管理员之外,您可以在其他任何地方保留 editable=False。例如(使用 Django 1.2.3 测试)

    # models.py
    class FooModel(models.Model):
        first = models.CharField(max_length = 255, editable = False)
        second  = models.CharField(max_length = 255)
    
        def __unicode__(self):
            return "{0} {1}".format(self.first, self.second)
    
    # admin.py
    class CustomFooForm(forms.ModelForm):
        first = forms.CharField()
    
        class Meta:
            model = FooModel
            fields = ('second',)
    
    class FooAdmin(admin.ModelAdmin):
        form = CustomFooForm
    
    admin.site.register(FooModel, FooAdmin)
    

    【讨论】:

    • 这不起作用,至少在 django 1.6 上表单在管理面板中正确显示,但是当我保存表单并再次返回时,表单值又是默认值。
    【解决方案2】:

    使用Readonly Fields。像这样(对于 django >= 1.2):

    class MyModelAdmin(admin.ModelAdmin):
        readonly_fields=('first',)
    

    【讨论】:

    • +1。特别是如果您打算在管理员中编辑该字段。
    • 这在这里不起作用(Django 2.0)。该字段不会显示在管理界面中。
    • 我刚刚创建了一个示例应用程序来重现您的错误(django 2.0.8、python 3.5)。这仍然可以正常工作。也许你的应用程序@nerdoc 中还有其他问题?
    • 哎呀。典型的快速射击。没测试,好像是我安装的问题。谢谢,对不起。
    • 对我来说,当我将它添加到 fields 时,管理员崩溃了,但是当我将它添加到 readonly_fields 时,它没有显示,直到我将它添加到两者然后它出现在管理员中。
    【解决方案3】:

    您的只读字段也必须在字段中:

    fields = ['title', 'author', 'content', 'published_date', 'updated_date', 'created_date']
    readonly_fields = ('published_date', 'updated_date', 'created_date')
    

    【讨论】:

    • 谢谢,这解决了我的问题。我只是将readonly_fields 放在顶部,让fields 成为可编辑字段+ readonly_fields(在我的代码中都是元组;我不明白为什么要将它们声明为列表)。
    【解决方案4】:

    您还可以在模型中将只读字段设置为editable=Falseeditablehere 的 django 文档参考)。然后在 Admin 中覆盖 get_readonly_fields 方法。

    # models.py
    class MyModel(models.Model):
      first = models.CharField(max_length=255, editable=False)
    
    # admin.py
    class MyModelAdmin(admin.ModelAdmin):
      def get_readonly_fields(self, request, obj=None):
        return [f.name for f in obj._meta.fields if not f.editable]
    

    【讨论】:

      【解决方案5】:

      通过上述解决方案,我能够显示多个对象的隐藏字段,但在尝试添加新对象时出现异常。

      所以我对它进行了如下增强:

      class HiddenFieldsAdmin(admin.ModelAdmin):
      def get_readonly_fields(self, request, obj=None):
          try:
              return [f.name for f in obj._meta.fields if not f.editable]
          except:
              # if a new object is to be created the try clause will fail due to missing _meta.fields
              return ""
      

      在相应的 admin.py 文件中,我只需导入新类并在注册新模型类时添加它

      from django.contrib import admin
      from .models import Example, HiddenFieldsAdmin
      
      admin.site.register(Example, HiddenFieldsAdmin)
      

      现在我可以在每个具有不可编辑字段的类上使用它,到目前为止我没有看到任何不必要的副作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-28
        • 2011-03-07
        • 2016-12-23
        • 2020-02-14
        • 2012-11-07
        • 1970-01-01
        • 2012-07-18
        • 1970-01-01
        相关资源
        最近更新 更多