Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>As Benjamin (<a href="https://stackoverflow.com/a/2359167/565525">https://stackoverflow.com/a/2359167/565525</a>) nicely explained, additionally to rendering correctly, you need to process field on backend properly. </p> <p>There is an SO <a href="https://stackoverflow.com/questions/324477/in-a-django-form-how-to-make-a-field-readonly-or-disabled-so-that-it-cannot-b?rq=1">question and answers</a> that has many good solutions. But anyway:</p> <p>1) first approach - removing field in save() method, e.g. (not tested ;) ):</p> <pre><code>def save(self, *args, **kwargs): for fname in self.readonly_fields: if fname in self.cleaned_data: del self.cleaned_data[fname] return super(&lt;form-name&gt;, self).save(*args,**kwargs) </code></pre> <p>2) second approach - reset field to initial value in clean method:</p> <pre><code>def clean_&lt;fieldname&gt;(self): return self.initial[&lt;fieldname&gt;] # or getattr(self.instance, &lt;fieldname&gt;) </code></pre> <p>Based on second approach I generalized it like this:</p> <pre><code>from functools import partial class &lt;Form-name&gt;(...): def __init__(self, ...): ... super(&lt;Form-name&gt;, 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) </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload