我有一个可通过 Django 管理区域访问的模型,如下所示:
# model
class Foo(models.Model):
field_a = models.CharField(max_length=100)
field_b = models.CharField(max_length=100)
# admin.py
class FooAdmin(admin.ModelAdmin):
pass
假设我想在用户添加对象时显示 field_a 和 field_b,但如果用户正在编辑对象,则只显示 field_a。有没有一种简单的方法可以做到这一点,也许使用 fields 属性?
如果出现这种情况,我可以破解一个 JavaScript 解决方案,但这样做根本不合适!
最佳答案
您可以创建自定义 ModelForm
让管理员删除 __init__
中的字段
class FooForm(forms.ModelForm):
class Meta(object):
model = Foo
def __init__(self, *args, **kwargs):
super(FooForm, self).__init__(*args, **kwargs)
if self.instance and self.instance.pk:
# Since the pk is set this is not a new instance
del self.fields['field_b']
class FooAdmin(admin.ModelAdmin):
form = FooForm
编辑:从约翰关于使字段只读的评论中得到提示,您可以将其设为隐藏字段并覆盖干净以确保该值不会更改。
class FooForm(forms.ModelForm):
class Meta(object):
model = Foo
def __init__(self, *args, **kwargs):
super(FooForm, self).__init__(*args, **kwargs)
if self.instance and self.instance.pk:
# Since the pk is set this is not a new instance
self.fields['field_b'].widget = forms.HiddenInput()
def clean_field_b(self):
if self.instance and self.instance.pk:
return self.instance.field_b
else:
return self.cleaned_data['field_b']
关于Django admin - 如果编辑对象,则删除字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2866896/