您可以创建自定义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
编辑的字段:从约翰的评论以暗示要进行现场只读,你可以把这个隐藏字段并重写clean以确保值不会更改。
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']
谢谢您的回答上当受骗!它看起来应该可以工作,但编辑对象时出现TemplateSyntaxError - “Form'中找不到Key”field_b“。任何想法如何解决? – 2010-05-19 15:49:44
我通过将字段更改为CharField(它最初是一个选择列表)并将其标记为只读 - 这对我的目的来说很好。类似于:self.fields ['field_b'] = forms.CharField(initial =“initial value”); self.fields ['field_b']。widget.attrs ['readonly'] =真 – 2010-05-19 16:03:24
废话我忘了管理员使用ModelAdmin字段集而不是模型上的字段来生成模板,但我很高兴你得到它的工作出。 – 2010-05-19 16:10:41