Вызов формы на основе строки в представлении - PullRequest
0 голосов
/ 17 мая 2018

Я строю представление в django, которое будет использоваться для отображения нескольких различных форм.Каждое имя формы хранится в экземпляре модели и вызывается в представлении.Несмотря на то, что у меня есть это имя формы, я не уверен, как я могу вызвать форму, используя строку, равную имени формы.Например, обычно в представлении вы можете увидеть что-то подобное для формы с именем myOwnForm.

form = myOwnForm(request.POST, request.FILES, instance=instance)   

В моем случае строка myOwnForm хранится в поле formname myFormModel.В результате я попробовал это.

formname = myFormModel.formname
form = formname(request.POST, request.FILES, instance=instance)

Это не может вызвать форму myOwnForm.Вы случайно не знаете, как я могу вызвать имя формы, используя строку, которая хранится в переменной?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

если хочешь попробовать.Создайте таблицу сопоставления и используйте переменную с именем.

formname = 'user
FORM_MODEL = {'user': UserModelForm}
model_form = FORM_MODEL[formname]
0 голосов
/ 17 мая 2018

Если у вас есть все потенциальные формы, содержащиеся в одном файле (например, forms.py), это так просто:

from MyApp import forms
form_as_str = 'MyForm' # or whatever you're calling it
my_form = getattr(forms, form_as_str)
my_form(request.POST, request.files, instance=instance)

Гораздо безопаснее, чем использовать eval, что я бы не советовал.

0 голосов
/ 17 мая 2018

Вы можете использовать eval() функцию Python.
eval(expression, globals=None, locals=None)
Аргумент выражения анализируется и оценивается как выражение Python с использованием глобальных и локальных словарей в качестве глобального и локального пространства имен

вместо:

formname = myFormModel.formname
form = formname(request.POST, request.FILES, instance=instance)

это будет

formname = eval(myFormModel.formname)
formname.data = request.POST
formname.files = request.FILES
formname.instance = instance

Или вы можете сделать это с длинной строкой.

formname = eval("%s(request.POST,request.FILES,instance=instance)" % myFormModel.formname)'

Evrything внутри eval () будет рассматриваться как выражение pytohn

...