在Django中向动态表单传递参数

27 投票
2 回答
24914 浏览
提问于 2025-04-15 19:06

我在表单中有一个动态表单。我该如何在创建表单的时候,从我的视图中传递一个参数呢?

就像这样:

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)

2 个回答

0

你还可以通过重写 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

想了解更多信息,可以查看这里

57

把它作为一个关键字参数添加,假设它叫做 my_arg。在调用 super() 之前,确保用 pop() 把这个关键字参数去掉,因为父类的初始化方法不接受额外的关键字参数。

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')

撰写回答