class Foo(models.Model):
description = models.TextField()
number = models.IntegerField()
class FooOnlyDescriptionIsReadOnly(ReadOnlyFieldsMixin, forms.ModelForm):
readonly_fields = ('description', )
class Meta:
model = Foo
fields = '__all__'
class FooAllFieldsIsReadOnly(ReadOnlyFieldsMixin, forms.ModelForm):
class Meta:
model = Foo
fields = '__all__'
or use the function
class FooForm(forms.ModelForm):
class Meta:
model = Foo
fields = '__all__'
ReadOnlyFooForm = new_readonly_form_class(FooForm, readonly_fields=('description', ))
from__future__importunicode_literals# created by Edgar Gabaldi https://github.com/edgabaldi# and Fabio C. Barrionuevo da Luz https://github.com/luzfcbfromdjango.utilsimportsixfromdjango.utils.encodingimportforce_str__all__=('ReadOnlyFieldsMixin','new_readonly_form_class')classReadOnlyFieldsMixin(object):"""Usage: class MyFormAllFieldsReadOnly(ReadOnlyFieldsMixin, forms.Form): ... class MyFormSelectedFieldsReadOnly(ReadOnlyFieldsMixin, forms.Form): readonly_fields = ('field1', 'field2') ... """readonly_fields=()def__init__(self,*args,**kwargs):super(ReadOnlyFieldsMixin,self).__init__(*args,**kwargs)self.define_readonly_fields(self.fields)defclean(self):cleaned_data=super(ReadOnlyFieldsMixin,self).clean()forfield_name,fieldinsix.iteritems(self.fields):ifself._must_be_readonly(field_name):cleaned_data[field_name]=getattr(self.instance,field_name)returncleaned_datadefdefine_readonly_fields(self,field_list):fields=[fieldforfield_name,fieldinsix.iteritems(field_list)ifself._must_be_readonly(field_name)]map(lambdafield:self._set_readonly(field),fields)def_all_fields(self):returnnotbool(self.readonly_fields)def_set_readonly(self,field):field.widget.attrs['disabled']='true'field.required=Falsedef_must_be_readonly(self,field_name):returnfield_nameinself.readonly_fieldsorself._all_fields()defnew_readonly_form_class(form_class,readonly_fields=()):name=force_str("ReadOnly{}".format(form_class.__name__))class_fields={'readonly_fields':readonly_fields}returntype(name,(ReadOnlyFieldsMixin,form_class),class_fields)
Comments
Please login first before commenting.