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!