【问题标题】:passing arguments to a dynamic form in django将参数传递给 django 中的动态表单
【发布时间】:2011-01-15 06:37:14
【问题描述】:

我在表单中有一个动态表单。实例化表单时如何从视图中传递参数?

类似:

form = DynamicForm("some string argument I'm passing to my form")

这是我的表格:

class DynamicForm(Form):
def __init__(self, *args, **kwargs):
    super(DynamicForm, self).__init__(*args, **kwargs)
    for item in range(5):
        self.fields['test_field_%d' % item] = CharField(max_length=255)

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    您也可以通过覆盖 FormMixin 的 get_form_kwargs 来实现这一点,该表单在基于类的视图中可用。

    class CustomDynamicFormView(FormView):  # inherit any view with formmixin...
          form_class = DynamicForm
          
          def get_form_kwargs(self):
              kwargs = super(CustomDynamicFormView, self).get_form_kwargs()
              kwargs['custom_variable'] = 'my custom variable'
              return kwargs
    

    然后在你的表单中

    class DynamicForm(forms.Form):
        def __init__(self, *args, **kwargs):
            my_var = kwargs.pop('custom_variable') 
            # remove this b4 calling super otherwise it will complian
            super(DynamicForm, self).__init__(*args, **kwargs)
            # do what you want with my_var
    

    For more information check here

    【讨论】:

      【解决方案2】:

      将它添加为关键字参数,假设它称为 my_arg。确保在调用super() 之前pop() 关键字arg,因为父类的init 方法不接受额外的关键字参数。

      class DynamicForm(Form):
        def __init__(self, *args, **kwargs):
          my_arg = kwargs.pop('my_arg')
          super(DynamicForm, self).__init__(*args, **kwargs)
          for item in range(5):
              self.fields['test_field_%d' % item] = CharField(max_length=255)
      

      当你创建表单时,它是这样的:

      form = DynamicForm(..., my_arg='value')
      

      【讨论】:

      • 只是为了说明,在了解**kwargs 时.. 我总是收到如下错误:__init__() got an unexpected keyword argument 'my_arg'。你必须.pop你的参数在你的构造函数的第一行,或者至少这帮助我解决了我的问题。
      • 我希望能够继承 DynamicForm 所以我有一个可以传递自定义参数的基 Form 类。你能举个例子吗?
      • @krizajB 实际上,您必须在 super() 之前使用 kwargs.pop,否则基类将收到它不支持的参数。但它不必是 first 行。
      猜你喜欢
      • 2020-04-13
      • 1970-01-01
      • 2013-01-17
      • 2018-12-11
      • 2015-07-10
      • 2020-03-21
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      相关资源
      最近更新 更多