2016-09-22 5 views
1

Я хочу создать различные формы в Flask с помощью WTForms и Jinja2. Я делаю вызов mysql, который имеет тип поля.создавать динамические поля в WTform in Flask

Так т.е. таблица может быть:

form_id | type   | key | options  | default_value 
    1  | TextField | title |     |  test1 
    1  | SelectField | gender |{'male','female'}|  
    2  | TextAreaField| text |     | Hello, World! 

Тогда я запрос на form_id. то я хочу создать форму с WTforms с полями возвращаемых строк.

Для нормальной формы я делаю:

class MyForm(Form): 

    title = TextField('test1', [validators.Length(min=4, max=25)]) 
    gender = SelectField('', choices=['male','female']) 


def update_form(request): 

    form = MyForm(request.form) 

    if request.method == 'POST' and form.validate(): 
      title = form.title.data 
      gender = form.gender.data 

      #do some updates with data 
      return ..... 
    else: 
      return render_template('template.html',form) 
      #here should be something like: 
      #dict = query_mysql() 
      #new_form = MyForm(dict); 
      #render_template('template.html',new_form) 

Я думаю, что лучше всего было бы создать пустую форму, а затем добавить поля в для цикла, однако если форма размещена назад, как я могу проверить правильность если я не определил его в классе? У меня есть form_id в форме, поэтому я могу сгенерировать его, а затем проверить.

ответ

4

Добавление полей динамически

Я думаю, что лучше всего было бы создать пустую форму, а затем добавить поля в для цикла, однако, если форма размещена назад, как я могу проверить форму, если я не» t определил ли он в классе?

Добавьте поля в класса формы с использованием setattr перед формой конкретизируется:

def update_form(request): 
    table = query() 

    class MyForm(Form): 
     pass 

    for row in table: 
     setattr(MyForm, row.key, SomeField()) 

    form = MyForm(request.form) 

Однако, я думаю, что ваш вопрос является частью более серьезной проблемой, которую я попытался обратиться ниже ,

Отображение таблиц в формах

Ваш стол, кажется, карта очень хорошо к самой форме. Если вы хотите динамически создавать формы из своих таблиц, вы можете сами написать логику. Но когда диапазон полей и вариантов поддержки растет, это может быть много работы по поддержанию. Если вы используете SQLAlchemy, вы можете взглянуть на WTForms-Alchemy. От его введения:

Много раз при создании современных веб-приложений с SQLAlchemy вы будете иметь формы, отображающую близко к моделям. Например, у вас может быть модель статьи , и вы хотите создать форму, которая позволяет пользователям публиковать новую статью . В этом случае было бы трудоемким определять поле типов и основных валидаторов в вашей форме, поскольку вы уже установили поля в своей модели.

WTForms-Alchemy предоставляет вспомогательный класс, который позволяет создать класс формы из модели SQLAlchemy.

Хелпер класс ModelForm и в стиле вашей таблице ниже приведен пример Python 2/3 с WTForms-алхимии. Сначала установите пакет wtforms-alchemy, который также потянет SQLAlchemy и WTForms.

from __future__ import print_function 
from __future__ import unicode_literals 

import sqlalchemy as sa 
from sqlalchemy import create_engine 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import sessionmaker 
from wtforms_alchemy import ModelForm 

engine = create_engine('sqlite:///:memory:') 
Base = declarative_base(engine) 
Session = sessionmaker(bind=engine) 
session = Session() 


class MyClass(Base): 
    __tablename__ = 'mytable' 

    id = sa.Column(sa.BigInteger, autoincrement=True, primary_key=True) 
    title = sa.Column(sa.Unicode(5), nullable=False) 
    gender = sa.Column(sa.Enum('male', 'female', name='gender')) 
    text = sa.Column(sa.Text) 


class MyForm(ModelForm): 
    class Meta: 
     model = MyClass 


form = MyForm() 

print('HTML\n====') 
for field in form: 
    print(field) 

выполнения кода напечатает:

HTML 
==== 
<input id="title" name="title" required type="text" value=""> 
<select id="gender" name="gender"><option value="male">male</option><option value="female">female</option></select> 
<textarea id="text" name="text"></textarea> 

Как вы можете видеть, WTForms-Alchemy сделал кучу с MyForm. Класс, по существу, это:

class MyForm(Form): 
    title = StringField(validators=[InputRequired(), Length(max=5)]) 
    gender = SelectField(choices=[('male', 'male'), ('female', 'female')]) 
    text = TextField() 

документация WTForms-Alchemy кажется очень всеобъемлющим. Я не использовал его сам, но если бы у меня была аналогичная проблема, я бы определенно попробовал это.

 Смежные вопросы

  • Нет связанных вопросов^_^