如何在Python中从forminstance创建formset

2024-10-02 20:40:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从一个form类的实例中得到一个Django-Formset。你知道吗

在我的form类中,我在init方法中添加了一些字段,因为表单必须提供一些灵活性。因此,我不能将类作为参数传递给formset\u工厂函数。你知道吗

你知道吗--表单.py你知道吗

class ConfigForm(forms.Form):
    def __init__(self, fields, fields_choices, *args, **kwargs):
        super(ConfigForm, self).__init__(*args, **kwargs)

        for field in fields:
            # instanciate Field from field data
            exec(
                f'self.fields["{field.name}"] ='
                f'forms.{field.field_type.field_type}('
                f'required = {field.required},'
                f'disabled = {field.disabled},'
                f'label = "{field.label}",'
                f'initial = "{field.value}",'
                f'widget = {field.widget},'
                f'help_text = "{field.description}"'
                f')'
                )
            # if field is a ChoiceField add choices to the field instance
            if 'ChoiceField' in field.field_type.field_type:
                self.fields[field.name].choices = [fields_choices[field.name]]

你知道吗--视图.py ... 你知道吗

form = forms.ConfigForm(active_fields, field_choices)
formset = formset_factory(form, extra=1)

。。。你知道吗

但是,如果我尝试使用ConfigForm实例调用formset\u工厂,则会出现以下错误:

Internal Server Error: /machines/testconfig/mw0-sap-001/
Traceback (most recent call last):
  File "C:\Users\maximilianwiederer\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\maximilianwiederer\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\maximilianwiederer\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\maximilianwiederer\AppData\Local\Programs\Python\Python37\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\maximilianwiederer\AppData\Local\Programs\Python\Python37\lib\site-packages\django\views\generic\base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "D:\Users\BKU\maximilianwiederer\OneDrive - Deutsche Bahn\Documents\Programmierung\Eclipse\sap4cloud-dev\machines\views.py", line 83, in get
    formset = forms.formset_factory(form, extra=1)
  File "C:\Users\maximilianwiederer\AppData\Local\Programs\Python\Python37\lib\site-packages\django\forms\formsets.py", line 441, in formset_factory
    return type(form.__name__ + 'FormSet', (formset,), attrs)
AttributeError: 'ConfigForm' object has no attribute '__name__'

Tags: inpyselfformfieldfieldslocalline
1条回答
网友
1楼 · 发布于 2024-10-02 20:40:52

不能将窗体实例传递到窗体集工厂。它需要一个类,而不是一个实例。但是,您可以向工厂提供一个参数字典,以提供所创建表单的每个实例。你知道吗

https://docs.djangoproject.com/en/2.2/topics/forms/formsets/#passing-custom-parameters-to-formset-forms

下面是我建议您如何编写代码。你知道吗

ConfigFormset = forms.formset_factory(forms.ConfigForm)
formset = ConfigFormset(
    form_kwargs={
        'fields' : active_fields,
        'fields_choices': {}
        }
    )

相关问题 更多 >