Как указано в этом ответе , Django 1.9 добавил атрибут Field.disabled :
При отключенном логическом аргументе, установленном в True, поле формы отключается с помощью атрибута отключенного HTML, поэтому пользователи не смогут его редактировать. Даже если пользователь изменяет значение поля, отправленное на сервер, оно будет игнорироваться в пользу значения из исходных данных формы.
В Django 1.8 и более ранних версиях, чтобы отключить запись в виджете и предотвратить злонамеренные взломы POST, вы должны очистить ввод в дополнение к установке атрибута readonly
в поле формы:
class ItemForm(ModelForm):
def __init__(self, *args, **kwargs):
super(ItemForm, self).__init__(*args, **kwargs)
instance = getattr(self, 'instance', None)
if instance and instance.pk:
self.fields['sku'].widget.attrs['readonly'] = True
def clean_sku(self):
instance = getattr(self, 'instance', None)
if instance and instance.pk:
return instance.sku
else:
return self.cleaned_data['sku']
Или замените if instance and instance.pk
на другое условие, указывающее, что вы редактируете. Вы также можете установить атрибут disabled
в поле ввода вместо readonly
.
Функция clean_sku
гарантирует, что значение readonly
не будет переопределено POST
.
В противном случае нет встроенного поля формы Django, которое будет отображать значение при отклонении связанных входных данных. Если это то, что вы хотите, вместо этого вы должны создать отдельное ModelForm
, исключающее не редактируемые поля, и просто распечатать их внутри шаблона.