Pregunta

Estoy tratando de crear una página de edición para un modelo existente (ya guardado en DB). El objeto de formulario espera que una instancia multidicta pueble sus campos. Esto es lo que tengo:

# the model - assumes Flask-SQLAlchemy
from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
class Person(db.Model):
    id   = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True)

    def __init__(self, name=name):
        self.name = name


# the form - assumes Flask-WTF ext.
from flask.ext.wtf import Form, TextField, Required, BooleanField

class PersonForm(Form):
    name = TextField('name')


## the view
@app.route('/person/edit/<id>/', methods=['GET', 'POST'])
def edit_person(id):
    person = Person.query.get(id)
    if person:
        form = PersonForm(person) #<-- raises error
        return render_template('edit_person.html', form=form)

Podría asignar cada campo en el formulario a cada campo del modelo. (form.data['name'] = person.name, etc...), pero eso parece redundante para modelos grandes. ¿Hay algún atajo que me falta?

¿Fue útil?

Solución

Consulte la documentación de WTForms:

http://wtforms.simplecodes.com/docs/0.6/forms.html#wtforms.form.form.

Pasas en el "obj" como argumento. Esto unirá las propiedades del modelo a los campos de formulario para proporcionar los valores predeterminados:

@app.route('/person/edit/<id>/', methods=['GET', 'POST'])
def edit_person(id):
    person = Person.query.get_or_404(id)
    form = PersonForm(obj=person)
    if form.validate_on_submit():
        form.populate_obj(person)

Observe también el método "Populate_obj". Este es un atajo útil que unirá los valores de formulario a las propiedades del modelo (solo aquellos campos que ha definido en su forma, por lo que es bastante seguro de usar).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top