字段选项中的变量作为参数
我想创建一个模型,在创建时设置为不可编辑(editable=False),而在编辑时设置为可编辑(editable=True)。我想它应该像这样:
home = models.ForeignKey(Team, editable=lambda self: True if self.id else False)
但是这样不行。也许重写init方法能帮我,但我不太确定该怎么做。我知道在save()方法中可以检查self.id,但那时候已经太晚了,我希望在管理员应用中填写字段时就能实现这种逻辑。
1 个回答
4
在你的 admin.py 文件中,添加以下内容(这是对 这段代码 的一个小扩展):
from django import forms
class ReadOnlyWidget(forms.Widget):
def __init__(self, original_value, display_value):
self.original_value = original_value
self.display_value = display_value
super(ReadOnlyWidget, self).__init__()
def render(self, name, value, attrs=None):
if self.display_value is not None:
return unicode(self.display_value)
return unicode(self.original_value)
def value_from_datadict(self, data, files, name):
return self.original_value
class ReadOnlyAdminFields(object):
def get_form(self, request, obj=None):
form = super(ReadOnlyAdminFields, self).get_form(request, obj)
fields = getattr(self, 'readonly', [])
if obj is not None:
fields += getattr(self, 'readonly_on_edit', [])
for field_name in fields:
if field_name in form.base_fields:
if hasattr(obj, 'get_%s_display' % field_name):
display_value = getattr(obj, 'get_%s_display' % field_name)()
else:
display_value = None
form.base_fields[field_name].widget = ReadOnlyWidget(getattr(obj, field_name, ''), display_value)
form.base_fields[field_name].required = False
return form
这样一来,你就可以指定在编辑对象时,某些字段应该是只读的,也就是说这些字段不能被修改:
class PersonAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
readonly_on_edit = ('home',)
admin.site.register(Person, PersonAdmin)