Wie Benjamin (https://stackoverflow.com/a/2359167/565525) gut erklärt, zusätzlich zum Rendern richtig, müssen Sie Feld auf Backend richtig verarbeiten.
Es gibt eine SO question and answers, die viele gute Lösungen hat. Aber trotzdem:
1) erste Ansatz - Entfernen Feld in save() - Methode, z. (Nicht getestet;)):
def save(self, *args, **kwargs):
for fname in self.readonly_fields:
if fname in self.cleaned_data:
del self.cleaned_data[fname]
return super(<form-name>, self).save(*args,**kwargs)
2) zweiter Ansatz - Reset-Feldwert in saubere Methode zur anfänglichen:
def clean_<fieldname>(self):
return self.initial[<fieldname>] # or getattr(self.instance, <fieldname>)
Basierend auf den zweiten Ansatz verallgemeinert ich es wie folgt aus:
from functools import partial
class <Form-name>(...):
def __init__(self, ...):
...
super(<Form-name>, self).__init__(*args, **kwargs)
...
for i, (fname, field) in enumerate(self.fields.iteritems()):
if fname in self.readonly_fields:
field.widget.attrs['readonly'] = "readonly"
field.required = False
# set clean method to reset value back
clean_method_name = "clean_%s" % fname
assert clean_method_name not in dir(self)
setattr(self, clean_method_name, partial(self._clean_for_readonly_field, fname=fname))
def _clean_for_readonly_field(self, fname):
""" will reset value to initial - nothing will be changed
needs to be added dynamically - partial, see init_fields
"""
return self.initial[fname] # or getattr(self.instance, fname)
Das in django geändert 1,9 https://stackoverflow.com/questions/324477/in-a-django-form-how -do-i-make-a-field-readonly-oder-deaktiviert-so-dass-es-kann nicht – zudebluvstein