In a Django form, how do I make a field readonly (or disabled) so that it cannot be edited?

后端 未结 26 1275
-上瘾入骨i
-上瘾入骨i 2020-11-22 04:09

In a Django form, how do I make a field read-only (or disabled)?

When the form is being used to create a new entry, all fields should be enabled - but when the recor

26条回答
  •  無奈伤痛
    2020-11-22 04:22

    Based on Yamikep's answer, I found a better and very simple solution which also handles ModelMultipleChoiceField fields.

    Removing field from form.cleaned_data prevents fields from being saved:

    class ReadOnlyFieldsMixin(object):
        readonly_fields = ()
    
        def __init__(self, *args, **kwargs):
            super(ReadOnlyFieldsMixin, self).__init__(*args, **kwargs)
            for field in (field for name, field in self.fields.iteritems() if
                          name in self.readonly_fields):
                field.widget.attrs['disabled'] = 'true'
                field.required = False
    
        def clean(self):
            for f in self.readonly_fields:
                self.cleaned_data.pop(f, None)
            return super(ReadOnlyFieldsMixin, self).clean()
    

    Usage:

    class MyFormWithReadOnlyFields(ReadOnlyFieldsMixin, MyForm):
        readonly_fields = ('field1', 'field2', 'fieldx')
    

提交回复
热议问题