Django admin:如何在模型中显示标记为editable = False'的字段?

Gab*_*iMe 89 django django-admin

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

tba*_*ack 180

使用只读字段.像这样(对于django> = 1.2):

class MyModelAdmin(admin.ModelAdmin):
    readonly_fields=('first',)
Run Code Online (Sandbox Code Playgroud)

  • +1.特别是如果你_don't_计划在Admin中编辑该字段. (5认同)
  • 这在这里不起作用(Django 2.0)。该字段不会显示在管理界面中。 (3认同)
  • 对我来说,当我将其添加到“ fields”中时,admin崩溃了,但是当我将其添加到“ readonly_fields”中时,直到我将其添加到这两个中之后,它才出现在admin中。 (2认同)

Man*_*dan 16

更新

如果您希望在Admin中保持字段可编辑但在其他任何位置不可编辑,则此解决方案非常有用.如果你想让整个领域不可编辑,那么@Till Backhaus的回答是更好的选择.

原始答案

一种方法是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)
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用,至少在 django 1.6 上,表单在管理面板中正确显示,但是当我保存表单并再次返回时,表单值再次默认。 (2认同)

小智 7

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

fields = ['title', 'author', 'content', 'published_date', 'updated_date', 'created_date']
readonly_fields = ('published_date', 'updated_date', 'created_date')
Run Code Online (Sandbox Code Playgroud)


小智 5

editable=False您还可以按照模型中的方式设置只读字段(editable 此处为 django 文档参考)。然后在管理中重写该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]
Run Code Online (Sandbox Code Playgroud)