Передача аргументов динамической форме в 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)
Ответы
Ответ 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
Для получения дополнительной информации проверьте здесь