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


99

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

Answers:


195

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

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

6
+1。特别是如果您根本不打算在Admin中编辑该字段。
Manoj Govindan

这在这里不起作用(Django 2.0)。然后,该字段不会显示在管理界面中。
nerdoc

1
我刚刚创建了一个示例应用程序来重现您的错误(django 2.0.8,python 3.5)。这仍然可以正常工作。也许您的应用@nerdoc中有其他问题吗?
tback

糟糕!典型的快速射击。没有测试,看来我的安装有问题。谢谢,对不起。
nerdoc

2
对我而言,当我将admin添加到时fields,管理员崩溃了,但是readonly_fields直到将其添加到admin中时,它才出现。
owenfi

18

更新资料

如果您想让该字段在Admin中保持可编辑状态,而在其他任何地方都不可编辑,则该解决方案很有用。如果您希望整个字段保持不可编辑状态那么@Till Backhaus的答案是更好的选择。

原始答案

一种方法是ModelForm在admin中使用自定义。此表单可以覆盖必填字段以使其可编辑。因此,您可以保留editable=False除Admin之外的所有其他位置。例如(经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)

1
这至少在django 1.6上不起作用。表单在管理面板中正确显示,但是当我保存表单并再次返回时,表单值再次成为默认值。
大戟2014年

4

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

fields = ['title', 'author', 'content', 'published_date', 'updated_date', 'created_date']
readonly_fields = ('published_date', 'updated_date', 'created_date')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.