def modelformset_factory(model, form=ModelForm, formfield_callback=None,
formset=BaseModelFormSet, extra=1, can_delete=False,
can_order=False, max_num=None, fields=None, exclude=None,
widgets=None, validate_max=False, localized_fields=None,
labels=None, help_texts=None, error_messages=None):
"""
Returns a FormSet class for the given Django model class.
"""
# modelform_factory will produce the same warning/error, but that will be
# difficult to debug for code that needs upgrading, so we produce the
# warning here too. This logic is reproducing logic inside
# modelform_factory, but it can be removed once the deprecation cycle is
# complete, since the validation exception will produce a helpful
# stacktrace.
meta = getattr(form, 'Meta', None)
if meta is None:
meta = type(str('Meta'), (object,), {})
if (getattr(meta, 'fields', fields) is None and
getattr(meta, 'exclude', exclude) is None):
warnings.warn("Calling modelformset_factory without defining 'fields' or "
"'exclude' explicitly is deprecated",
PendingDeprecationWarning, stacklevel=2)
form = modelform_factory(model, form=form, fields=fields, exclude=exclude,
formfield_callback=formfield_callback,
widgets=widgets, localized_fields=localized_fields,
labels=labels, help_texts=help_texts, error_messages=error_messages)
FormSet = formset_factory(form, formset, extra=extra, max_num=max_num,
can_order=can_order, can_delete=can_delete,
validate_max=validate_max)
FormSet.model = model
return FormSet
# InlineFormSets #############################################################
python类formset_factory()的实例源码
def test_for_formset(self):
TestFormSet = formset_factory(TestForm, extra=1)
test_formset = TestFormSet()
res = render_template_with_form(
'{% bootstrap_formset formset show_label=False %}',
{'formset': test_formset}
)
self.assertIn('sr-only', res)
def modelformset_factory(model, form=ModelForm, formfield_callback=None,
formset=BaseModelFormSet, extra=1, can_delete=False,
can_order=False, max_num=None, fields=None, exclude=None,
widgets=None, validate_max=False, localized_fields=None,
labels=None, help_texts=None, error_messages=None,
min_num=None, validate_min=False, field_classes=None):
"""
Returns a FormSet class for the given Django model class.
"""
meta = getattr(form, 'Meta', None)
if (getattr(meta, 'fields', fields) is None and
getattr(meta, 'exclude', exclude) is None):
raise ImproperlyConfigured(
"Calling modelformset_factory without defining 'fields' or "
"'exclude' explicitly is prohibited."
)
form = modelform_factory(model, form=form, fields=fields, exclude=exclude,
formfield_callback=formfield_callback,
widgets=widgets, localized_fields=localized_fields,
labels=labels, help_texts=help_texts,
error_messages=error_messages, field_classes=field_classes)
FormSet = formset_factory(form, formset, extra=extra, min_num=min_num, max_num=max_num,
can_order=can_order, can_delete=can_delete,
validate_min=validate_min, validate_max=validate_max)
FormSet.model = model
return FormSet
# InlineFormSets #############################################################
def modelformset_factory(model, form=ModelForm, formfield_callback=None,
formset=BaseModelFormSet, extra=1, can_delete=False,
can_order=False, max_num=None, fields=None, exclude=None,
widgets=None, validate_max=False, localized_fields=None,
labels=None, help_texts=None, error_messages=None,
min_num=None, validate_min=False, field_classes=None):
"""
Returns a FormSet class for the given Django model class.
"""
meta = getattr(form, 'Meta', None)
if (getattr(meta, 'fields', fields) is None and
getattr(meta, 'exclude', exclude) is None):
raise ImproperlyConfigured(
"Calling modelformset_factory without defining 'fields' or "
"'exclude' explicitly is prohibited."
)
form = modelform_factory(model, form=form, fields=fields, exclude=exclude,
formfield_callback=formfield_callback,
widgets=widgets, localized_fields=localized_fields,
labels=labels, help_texts=help_texts,
error_messages=error_messages, field_classes=field_classes)
FormSet = formset_factory(form, formset, extra=extra, min_num=min_num, max_num=max_num,
can_order=can_order, can_delete=can_delete,
validate_min=validate_min, validate_max=validate_max)
FormSet.model = model
return FormSet
# InlineFormSets #############################################################
def modelformset_factory(model, form=ModelForm, formfield_callback=None,
formset=BaseModelFormSet, extra=1, can_delete=False,
can_order=False, max_num=None, fields=None, exclude=None,
widgets=None, validate_max=False, localized_fields=None,
labels=None, help_texts=None, error_messages=None,
min_num=None, validate_min=False):
"""
Returns a FormSet class for the given Django model class.
"""
meta = getattr(form, 'Meta', None)
if meta is None:
meta = type(str('Meta'), (object,), {})
if (getattr(meta, 'fields', fields) is None and
getattr(meta, 'exclude', exclude) is None):
raise ImproperlyConfigured(
"Calling modelformset_factory without defining 'fields' or "
"'exclude' explicitly is prohibited."
)
form = modelform_factory(model, form=form, fields=fields, exclude=exclude,
formfield_callback=formfield_callback,
widgets=widgets, localized_fields=localized_fields,
labels=labels, help_texts=help_texts, error_messages=error_messages)
FormSet = formset_factory(form, formset, extra=extra, min_num=min_num, max_num=max_num,
can_order=can_order, can_delete=can_delete,
validate_min=validate_min, validate_max=validate_max)
FormSet.model = model
return FormSet
# InlineFormSets #############################################################
def modelformset_factory(model, form=ModelForm, formfield_callback=None,
formset=BaseModelFormSet, extra=1, can_delete=False,
can_order=False, max_num=None, fields=None, exclude=None,
widgets=None, validate_max=False, localized_fields=None,
labels=None, help_texts=None, error_messages=None,
min_num=None, validate_min=False, field_classes=None):
"""
Returns a FormSet class for the given Django model class.
"""
meta = getattr(form, 'Meta', None)
if meta is None:
meta = type(str('Meta'), (object,), {})
if (getattr(meta, 'fields', fields) is None and
getattr(meta, 'exclude', exclude) is None):
raise ImproperlyConfigured(
"Calling modelformset_factory without defining 'fields' or "
"'exclude' explicitly is prohibited."
)
form = modelform_factory(model, form=form, fields=fields, exclude=exclude,
formfield_callback=formfield_callback,
widgets=widgets, localized_fields=localized_fields,
labels=labels, help_texts=help_texts,
error_messages=error_messages, field_classes=field_classes)
FormSet = formset_factory(form, formset, extra=extra, min_num=min_num, max_num=max_num,
can_order=can_order, can_delete=can_delete,
validate_min=validate_min, validate_max=validate_max)
FormSet.model = model
return FormSet
# InlineFormSets #############################################################
def modelformset_factory(model, form=ModelForm, formfield_callback=None,
formset=BaseModelFormSet, extra=1, can_delete=False,
can_order=False, max_num=None, fields=None, exclude=None,
widgets=None, validate_max=False, localized_fields=None,
labels=None, help_texts=None, error_messages=None,
min_num=None, validate_min=False, field_classes=None):
"""
Returns a FormSet class for the given Django model class.
"""
meta = getattr(form, 'Meta', None)
if (getattr(meta, 'fields', fields) is None and
getattr(meta, 'exclude', exclude) is None):
raise ImproperlyConfigured(
"Calling modelformset_factory without defining 'fields' or "
"'exclude' explicitly is prohibited."
)
form = modelform_factory(model, form=form, fields=fields, exclude=exclude,
formfield_callback=formfield_callback,
widgets=widgets, localized_fields=localized_fields,
labels=labels, help_texts=help_texts,
error_messages=error_messages, field_classes=field_classes)
FormSet = formset_factory(form, formset, extra=extra, min_num=min_num, max_num=max_num,
can_order=can_order, can_delete=can_delete,
validate_min=validate_min, validate_max=validate_max)
FormSet.model = model
return FormSet
# InlineFormSets #############################################################
def modelformset_factory(model, form=ModelForm, formfield_callback=None,
formset=BaseModelFormSet, extra=1, can_delete=False,
can_order=False, max_num=None, fields=None, exclude=None,
widgets=None, validate_max=False, localized_fields=None,
labels=None, help_texts=None, error_messages=None,
min_num=None, validate_min=False, field_classes=None):
"""
Returns a FormSet class for the given Django model class.
"""
meta = getattr(form, 'Meta', None)
if meta is None:
meta = type(str('Meta'), (object,), {})
if (getattr(meta, 'fields', fields) is None and
getattr(meta, 'exclude', exclude) is None):
raise ImproperlyConfigured(
"Calling modelformset_factory without defining 'fields' or "
"'exclude' explicitly is prohibited."
)
form = modelform_factory(model, form=form, fields=fields, exclude=exclude,
formfield_callback=formfield_callback,
widgets=widgets, localized_fields=localized_fields,
labels=labels, help_texts=help_texts,
error_messages=error_messages, field_classes=field_classes)
FormSet = formset_factory(form, formset, extra=extra, min_num=min_num, max_num=max_num,
can_order=can_order, can_delete=can_delete,
validate_min=validate_min, validate_max=validate_max)
FormSet.model = model
return FormSet
# InlineFormSets #############################################################
def test_for_formset(self):
TestFormSet = formset_factory(TestForm, extra=1)
test_formset = TestFormSet()
res = self.render_template_with_form(
'{% propeller_formset formset show_label=False %}',
{'formset': test_formset}
)
self.assertIn('sr-only', res)
def modelformset_factory(model, form=ModelForm, formfield_callback=None,
formset=BaseModelFormSet, extra=1, can_delete=False,
can_order=False, max_num=None, fields=None, exclude=None,
widgets=None, validate_max=False, localized_fields=None,
labels=None, help_texts=None, error_messages=None,
min_num=None, validate_min=False, field_classes=None):
"""
Returns a FormSet class for the given Django model class.
"""
meta = getattr(form, 'Meta', None)
if meta is None:
meta = type(str('Meta'), (object,), {})
if (getattr(meta, 'fields', fields) is None and
getattr(meta, 'exclude', exclude) is None):
raise ImproperlyConfigured(
"Calling modelformset_factory without defining 'fields' or "
"'exclude' explicitly is prohibited."
)
form = modelform_factory(model, form=form, fields=fields, exclude=exclude,
formfield_callback=formfield_callback,
widgets=widgets, localized_fields=localized_fields,
labels=labels, help_texts=help_texts,
error_messages=error_messages, field_classes=field_classes)
FormSet = formset_factory(form, formset, extra=extra, min_num=min_num, max_num=max_num,
can_order=can_order, can_delete=can_delete,
validate_min=validate_min, validate_max=validate_max)
FormSet.model = model
return FormSet
# InlineFormSets #############################################################
def test_for_formset(self):
TestFormSet = formset_factory(TestForm, extra=1)
test_formset = TestFormSet()
res = render_template_with_form(
'{% bootstrap_formset formset show_label=False %}',
{'formset': test_formset}
)
self.assertIn('sr-only', res)
# TODO change for the new icons
# def test_button_with_icon(self):
# res = render_template_with_form(
# "{% bootstrap_button 'test' icon='info-sign' %}"
# )
# self.assertEqual(
# res.strip(),
# '<button class="btn btn-default"><span class="glyphicon glyphicon-info-sign"></span> test</button>'
# )
# res = render_template_with_form(
# "{% bootstrap_button 'test' icon='info-sign' button_class='btn-primary' %}"
# )
# self.assertEqual(
# res.strip(),
# '<button class="btn btn-primary"><span class="glyphicon glyphicon-info-sign"></span> test</button>'
# )
# res = render_template_with_form(
# "{% bootstrap_button 'test' icon='info-sign' button_type='submit' %}"
# )
# self.assertEqual(
# res.strip(),
# '<button class="btn btn-default" type="submit"><span class="glyphicon glyphicon-info-sign"></span> test</button>'
def test_for_formset(self):
TestFormSet = formset_factory(TestForm, extra=1)
test_formset = TestFormSet()
res = render_template_with_form(
'{% bootstrap_formset formset show_label=False %}',
{'formset': test_formset}
)
self.assertIn('sr-only', res)
# TODO change for the new icons
# def test_button_with_icon(self):
# res = render_template_with_form(
# "{% bootstrap_button 'test' icon='info-sign' %}"
# )
# self.assertEqual(
# res.strip(),
# '<button class="btn btn-default"><span class="glyphicon glyphicon-info-sign"></span> test</button>'
# )
# res = render_template_with_form(
# "{% bootstrap_button 'test' icon='info-sign' button_class='btn-primary' %}"
# )
# self.assertEqual(
# res.strip(),
# '<button class="btn btn-primary"><span class="glyphicon glyphicon-info-sign"></span> test</button>'
# )
# res = render_template_with_form(
# "{% bootstrap_button 'test' icon='info-sign' button_type='submit' %}"
# )
# self.assertEqual(
# res.strip(),
# '<button class="btn btn-default" type="submit"><span class="glyphicon glyphicon-info-sign"></span> test</button>'
def test_for_formset(self):
TestFormSet = formset_factory(TestForm, extra=1)
test_formset = TestFormSet()
res = render_template_with_form(
'{% bootstrap_formset formset show_label=False %}',
{'formset': test_formset}
)
self.assertIn('sr-only', res)
# TODO change for the new icons
# def test_button_with_icon(self):
# res = render_template_with_form(
# "{% bootstrap_button 'test' icon='info-sign' %}"
# )
# self.assertEqual(
# res.strip(),
# '<button class="btn btn-default"><span class="glyphicon glyphicon-info-sign"></span> test</button>'
# )
# res = render_template_with_form(
# "{% bootstrap_button 'test' icon='info-sign' button_class='btn-primary' %}"
# )
# self.assertEqual(
# res.strip(),
# '<button class="btn btn-primary"><span class="glyphicon glyphicon-info-sign"></span> test</button>'
# )
# res = render_template_with_form(
# "{% bootstrap_button 'test' icon='info-sign' button_type='submit' %}"
# )
# self.assertEqual(
# res.strip(),
# '<button class="btn btn-default" type="submit"><span class="glyphicon glyphicon-info-sign"></span> test</button>'
def test_for_formset(self):
TestFormSet = formset_factory(TestForm, extra=1)
test_formset = TestFormSet()
res = render_template_with_form(
'{% bootstrap_formset formset show_label=False %}',
{'formset': test_formset}
)
self.assertIn('sr-only', res)
# TODO change for the new icons
# def test_button_with_icon(self):
# res = render_template_with_form(
# "{% bootstrap_button 'test' icon='info-sign' %}"
# )
# self.assertEqual(
# res.strip(),
# '<button class="btn btn-default"><span class="glyphicon glyphicon-info-sign"></span> test</button>'
# )
# res = render_template_with_form(
# "{% bootstrap_button 'test' icon='info-sign' button_class='btn-primary' %}"
# )
# self.assertEqual(
# res.strip(),
# '<button class="btn btn-primary"><span class="glyphicon glyphicon-info-sign"></span> test</button>'
# )
# res = render_template_with_form(
# "{% bootstrap_button 'test' icon='info-sign' button_type='submit' %}"
# )
# self.assertEqual(
# res.strip(),
# '<button class="btn btn-default" type="submit"><span class="glyphicon glyphicon-info-sign"></span> test</button>'
def test_for_formset(self):
TestFormSet = formset_factory(TestForm, extra=1)
test_formset = TestFormSet()
res = render_template_with_form(
'{% bootstrap_formset formset show_label=False %}',
{'formset': test_formset}
)
self.assertIn('sr-only', res)
# TODO change for the new icons
# def test_button_with_icon(self):
# res = render_template_with_form(
# "{% bootstrap_button 'test' icon='info-sign' %}"
# )
# self.assertEqual(
# res.strip(),
# '<button class="btn btn-default"><span class="glyphicon glyphicon-info-sign"></span> test</button>'
# )
# res = render_template_with_form(
# "{% bootstrap_button 'test' icon='info-sign' button_class='btn-primary' %}"
# )
# self.assertEqual(
# res.strip(),
# '<button class="btn btn-primary"><span class="glyphicon glyphicon-info-sign"></span> test</button>'
# )
# res = render_template_with_form(
# "{% bootstrap_button 'test' icon='info-sign' button_type='submit' %}"
# )
# self.assertEqual(
# res.strip(),
# '<button class="btn btn-default" type="submit"><span class="glyphicon glyphicon-info-sign"></span> test</button>'
def modelformset_factory(model, form=ModelForm, formfield_callback=None,
formset=BaseModelFormSet, extra=1, can_delete=False,
can_order=False, max_num=None, fields=None, exclude=None,
widgets=None, validate_max=False, localized_fields=None,
labels=None, help_texts=None, error_messages=None,
min_num=None, validate_min=False):
"""
Returns a FormSet class for the given Django model class.
"""
meta = getattr(form, 'Meta', None)
if meta is None:
meta = type(str('Meta'), (object,), {})
if (getattr(meta, 'fields', fields) is None and
getattr(meta, 'exclude', exclude) is None):
raise ImproperlyConfigured(
"Calling modelformset_factory without defining 'fields' or "
"'exclude' explicitly is prohibited."
)
form = modelform_factory(model, form=form, fields=fields, exclude=exclude,
formfield_callback=formfield_callback,
widgets=widgets, localized_fields=localized_fields,
labels=labels, help_texts=help_texts, error_messages=error_messages)
FormSet = formset_factory(form, formset, extra=extra, min_num=min_num, max_num=max_num,
can_order=can_order, can_delete=can_delete,
validate_min=validate_min, validate_max=validate_max)
FormSet.model = model
return FormSet
# InlineFormSets #############################################################
def post(self, request):
"""
The form has been submitted, process it.
"""
ObjectFormSet = formset_factory(self.form_model, extra=0)
formset = ObjectFormSet(request.POST)
new_objects = []
if formset.is_valid():
for form in formset:
if form.is_valid():
instance = form.save()
new_objects.append(instance)
if new_objects:
# Notify user of successful import
message = 'Imported {} {}'.format(
len(new_objects), new_objects[0]._meta.verbose_name_plural)
messages.success(request, message)
# Log the import action
UserAction.objects.log_import(request.user, ContentType.objects.get_for_model(
self.form_model._meta.model), message)
return redirect(self.get_return_url())
formset = ObjectFormSet()
return render(request, self.template, {
'formset': formset,
'obj_type': self.form_model._meta.model._meta.verbose_name,
'return_url': self.get_return_url(),
})