【发布时间】:2011-04-27 10:16:32
【问题描述】:
即使模型中的字段标记为'editable=False',我也希望管理页面显示它。目前它完全隐藏了该领域..如何实现?
【问题讨论】:
标签: django django-admin
即使模型中的字段标记为'editable=False',我也希望管理页面显示它。目前它完全隐藏了该领域..如何实现?
【问题讨论】:
标签: django django-admin
更新
如果您希望该字段在 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)
【讨论】:
使用Readonly Fields。像这样(对于 django >= 1.2):
class MyModelAdmin(admin.ModelAdmin):
readonly_fields=('first',)
【讨论】:
fields 时,管理员崩溃了,但是当我将它添加到 readonly_fields 时,它没有显示,直到我将它添加到两者然后它出现在管理员中。
您的只读字段也必须在字段中:
fields = ['title', 'author', 'content', 'published_date', 'updated_date', 'created_date']
readonly_fields = ('published_date', 'updated_date', 'created_date')
【讨论】:
readonly_fields 放在顶部,让fields 成为可编辑字段+ readonly_fields(在我的代码中都是元组;我不明白为什么要将它们声明为列表)。
您还可以在模型中将只读字段设置为editable=False(editablehere 的 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]
【讨论】:
通过上述解决方案,我能够显示多个对象的隐藏字段,但在尝试添加新对象时出现异常。
所以我对它进行了如下增强:
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)
现在我可以在每个具有不可编辑字段的类上使用它,到目前为止我没有看到任何不必要的副作用。
【讨论】: