update tutorial remove queries delete python sqlalchemy flask wtforms flask-wtforms

python - tutorial - Genera una forma dinámica usando flask-wtf y sqlalchemy



sqlalchemy documentation (1)

Creo que logré crear formularios dinámicos con la idea desde aquí https://groups.google.com/forum/#!topic/wtforms/cJl3aqzZieA

debe crear un formulario dinámico en la función de vista, buscar el campo de formulario que desea obtener e iterar cada campo para construir este objeto de formulario. Utilicé campos de tipo texto simple en lugar de valores enteros. Ya que parece fácil de leer a nivel de código.

class FormView(MethodView): def get(self): class DynamicForm(wtforms.Form): pass dform = main.models.Form.objects.get(name="name2") name = dform.name for f in dform.fields: print f.label setattr(DynamicForm , f.label, self.getField(f)) d = DynamicForm() # Dont forget to instantiate your new form before rendering for field in d: print field # you can see html output of fields return render_template("customform.html", form=d) def getField(self, field): if field.fieldtype == "text": return TextField(field.label) if field.fieldtype == "password": return PasswordField(field.label) # can extend if clauses at every new fieldtype

para una forma simple renderizar la plantilla jinja ''forms.html''

{% macro render(form) -%} <fieldset> {% for field in form %} {% if field.type in [''CSRFTokenField'', ''HiddenField''] %} {{ field() }} {% else %} <div class="form-group {% if field.errors %}error{% endif %}"> {{ field.label }} <div class="input"> {% if field.name == "body" %} {{ field(rows=10, cols=40) }} {% else %} {{ field() }} {% endif %} {% if field.errors or field.help_text %} <span class="help-inline"> {% if field.errors %} {{ field.errors|join('' '') }} {% else %} {{ field.help_text }} {% endif %} </span> {% endif %} </div> </div> {% endif %} {% endfor %} </fieldset> {% endmacro %}

y customform.html es como esto

{% extends "base.html" %} {% import "forms.html" as forms %} {% block content %} {{ forms.render(form) }} {% endblock %}

Tengo una aplicación web que permite a los usuarios crear sus propios campos para que se representen más adelante.

Tengo un modelo de Formfield así:

class Formfield(db.Model): id = db.Column(db.Integer, primary_key = True) form_id = db.Column(db.Integer, db.ForeignKey(''formbooking.id'')) label = db.Column(db.String(80)) placeholder_text = db.Column(db.String(80)) help_text = db.Column(db.String(500)) box_checked = db.Column(db.Boolean, nullable = True, default = False) options = db.Column(db.String) # JSON goes here? answer = db.Column(db.String) required = db.Column(db.Boolean, nullable = False, default = False) order = db.Column(db.Integer) fieldtype = db.Column(db.Integer)

que uso para representar un campo, cualquiera que sea el tipo (casilla de verificación, entrada, más en el futuro).

Como puede ver, cada campo tiene un FK a un form_id.

Intento generar un formulario dinámico para un form_id dado. El problema es que necesito determinar el tipo de campo que se representará para cada Formfield. Entonces también necesito procesar el tipo de campo en algún momento.

Supongo que una solución sería pasar el form_id a una función en mi clase Form.

No tengo ni idea de cómo hacerlo ni dónde buscar una solución.

¡Cualquier ayuda será muy apreciada!