Динамически генерировать колбу-WTF форму - PullRequest
0 голосов
/ 06 декабря 2018

Мне нужно сделать много радиополей, и я подумал, что было бы хорошо их динамически сгенерировать, но я не могу заставить работать код.Я использую Flask и flask-wtf.

Определение формы:

from flask_wtf import FlaskForm
from wtforms import RadioField, SubmitField

class GenerateForm(FlaskForm):
    def binary_generator(self, label_text, yes_text, no_text):
        return RadioField(label_text, choices=[(1, yes_text), (0, no_text)])

    submit = SubmitField('submit')

Приложение для колб:

import GeneratorForm

form = GeneratorForm
form.radio_one = form.binary_generator('test label', 'yes', 'no')

render_template('file.html', form=form)

Jinja:

{{ form.radio_one.label }}
{{ form.radio_one(style="list-style: none") }}

Jinja терпит неудачу с: wtforms.fields.core.UnboundField object has no attribute label

Так что похоже, что функция класса binary_generator работает нормально, но не создает форму правильно?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Базовый класс FlaskForm довольно специфичен в своей конструкции.Чтобы определить динамическую форму, добавьте параметры после того, как базовый класс был создан с super().Т.е.

class GenerateForm(FlaskForm):
    radio_fields = RadioField('', choices=[])
    submit = SubmitField('submit')

    def __init__(self, label, choices):
        super().__init__()
        self.radio_fields.choices = label
        self.radio_fields.choices = choices

Затем вы можете создать экземпляр формы с помощью:

GenerateForm('My Label', [('val', 'desc'), ('val2', 'desc2')])]

Вы также можете создать Фабрику форм следующим образом:

def Form(n, *args):
    class FormGenerator(FlaskForm):
        submit = SubmitField('submit')

    for i in range(n):
        setattr(FormGenerator, RadioField(args[i][0], choices=args[i][1])

    return FormGenerator()

Затем выможет создать экземпляр формы с помощью:

Form(2, *(('rad1', [('v1', 'd1'), ('v2', 'd2')]), ('rad2', [('v1', 'd1'), ('v2', 'd2')])))
0 голосов
/ 06 декабря 2018

Вам нужен этот binary_generator метод в GenerateForm?

Ваш GenerateForm может выглядеть примерно так:

from flask_wtf import FlaskForm
from wtforms import RadioField, SubmitField

class GenerateForm(FlaskForm):
    radio_fields = RadioField('', choices=[])
    submit = SubmitField('submit')

И в вашем приложении для колб вам нужно создать экземпляр вашегоформа.

import GeneratorForm

form = GeneratorForm() # Instantiate it

form.radio_fields.label = 'Label Example'
form.radio_fields.choices = [('value_1', 'description'), ('value_2', 'description')] 

render_template('file.html', form=form)

РЕДАКТИРОВАТЬ:

И для рендеринга вашей формы в file.html:

<form method="post">
    {{ form.hidden_tag() }}
    {{ form.radio_fields.label }}
    {{ form.radio_fields(style='list-style: none') }}
    {{ form.submit }}
</form>
...