76 |
76 |
self.save_m2m = save_m2m
|
77 |
77 |
return result
|
78 |
78 |
|
|
79 |
|
79 |
80 |
def modelform_factory(model, **kwargs):
|
80 |
81 |
'''Build a modelform for the given model,
|
81 |
82 |
|
82 |
83 |
For the user model also add attribute based fields.
|
83 |
84 |
'''
|
84 |
|
form = kwargs.pop('form', None) or forms.ModelForm
|
|
85 |
form = kwargs.pop('form', None)
|
85 |
86 |
fields = kwargs.get('fields', [])
|
86 |
87 |
required = list(kwargs.pop('required', []))
|
87 |
88 |
d = {}
|
88 |
|
if not form or not hasattr(form, 'Meta'):
|
89 |
|
meta_d = {'model': model, 'fields': '__all__'}
|
90 |
|
meta = type('Meta', (), meta_d)
|
91 |
|
d['Meta'] = meta
|
92 |
|
bases = (form,)
|
93 |
89 |
# KV attributes are only supported for the user model currently
|
94 |
90 |
modelform = None
|
95 |
91 |
if model == get_user_model():
|
96 |
|
if form:
|
97 |
|
bases = (form,)
|
98 |
|
else:
|
99 |
|
bases = (BaseUserForm,)
|
|
92 |
if not form:
|
|
93 |
form = BaseUserForm
|
100 |
94 |
attributes = models.Attribute.objects.all()
|
101 |
95 |
for attribute in attributes:
|
102 |
96 |
if fields and attribute.name not in fields:
|
... | ... | |
105 |
99 |
for field in app_settings.A2_REQUIRED_FIELDS:
|
106 |
100 |
if not field in required:
|
107 |
101 |
required.append(field)
|
|
102 |
if not form or not hasattr(form, 'Meta'):
|
|
103 |
meta_d = {'model': model, 'fields': '__all__'}
|
|
104 |
meta = type('Meta', (), meta_d)
|
|
105 |
d['Meta'] = meta
|
|
106 |
if not form: # fallback
|
|
107 |
form = forms.ModelForm
|
108 |
108 |
modelform = None
|
109 |
109 |
if required:
|
110 |
110 |
def __init__(self, *args, **kwargs):
|
111 |
111 |
super(modelform, self).__init__(*args, **kwargs)
|
112 |
112 |
for field in required:
|
113 |
113 |
if field in self.fields:
|
114 |
|
self.fields[field].required = True
|
|
114 |
self.fields[field].required = True
|
115 |
115 |
d['__init__'] = __init__
|
116 |
|
modelform = type(model.__name__ + 'ModelForm', bases, d)
|
|
116 |
modelform = type(model.__name__ + 'ModelForm', (form,), d)
|
117 |
117 |
kwargs['form'] = modelform
|
118 |
118 |
return django_modelform_factory(model, **kwargs)
|
119 |
|
-
|