使欄位不可編輯

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"))

這個例子是基於這個問題的