Подтвердить что ты не робот

Передача аргументов динамической форме в django

У меня есть динамическая форма в формах. Как передать аргумент из моего представления при создании экземпляра формы?

Что-то вроде:

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)
4b9b3361

Ответ 1

Добавьте его как аргумент ключевого слова, скажем, он называется my_arg. Обязательно pop() ключевое слово arg перед вызовом super(), потому что метод 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')

Ответ 2

Вы также можете достичь этого, переопределив get_form_kwargs FormMixin, доступного в представлениях на основе классов.

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

Для получения дополнительной информации проверьте здесь