使欄位不可編輯
Django 1.9
新增了 Field.disabled 屬性:
禁用的 boolean 引數設定為 True 時,將使用禁用的 HTML 屬性禁用表單欄位,以便使用者無法編輯它。即使使用者篡改提交給伺服器的欄位值,也會忽略表單初始資料中的值。
所以你只需要這樣做:
MyChangeForm(ModelForm):
def __init__(self, *args, **kwargs):
super(MyChangeForm, self).__init__(*args, **kwargs)
self.fields['<field_to_disable>'].disabled = True
並建立你需要的表單:
MyChangeForm(initial={'<field_to_disable>': "something"})
在版本 1.9
之前你必須:
class MyChangeForm(ModelForm):
def __init__(self, *args, **kwargs):
super(ItemForm, self).__init__(*args, **kwargs)
instance = getattr(self, 'instance', None)
if instance and instance.id:
self.fields['<field_to_disable>'].required = False
self.fields['<field_to_disable>'].widget.attrs['disabled'] = True
def clean_<field_to_disable>(self):
# As shown in the above answer.
instance = getattr(self, 'instance', None)
if instance:
return instance.<field_to_disable>
else:
return self.cleaned_data.get('<field_to_disable>', None)
並建立你需要的表單:
MyChangeForm(instance=MyChange.objects.get_or_create(<field_to_disable>="something"))
這個例子是基於這個問題的 。