2011-06-01 28 views
5

Tengo una plantilla que permite al usuario editar su información de usuario.Usando el método populate_obj() de WTForms con Flask micro framework

<form method="post"> 
    <table> 
     <tr> 
      <td>Username:</td> 
      <td>{{user['username']}}</td> 
     </tr> 
     <tr> 
      <td>New Password:</td> 
      <td> <input type="password" name="password"></td> 
      <td>{% if form.password.errors %} {{form.password.errors}} {% endif %}<td> 
     </tr> 
     <tr> 
      <td>Re-enter Password:</td> 
      <td> <input type="password" name="confirm_password"> 
      </td> 
     </tr> 
     <input type='hidden' name='username' value="{{user['username']}}"> 
     <tr> 
      <td><input type="submit" value="Submit"></td> 
     </tr> 
    </table> 
</form> 

También tengo una función de vista para manejar tales ediciones por el usuario. La base de datos que estoy usando actualmente es MongoDB con el módulo MongoKit. Solo he podido hacer esto hasta ahora en la función de vista, pero sin suerte.

def edit(): 
    username = request.args.get('user') 
    user = User.find_one({'username':username}) # Is this a correct way of doing it? 
    form = UserForm(**what should be placed here?**, obj=user) 

    if request.method == 'POST' and form.validate(): 
     form.populate_obj(user) 
     user.save() 
     return 'updated' 
    return render_template('edituser.html', form=form, user=user) 

Estoy pasando por populate_obj(obj) para este propósito. No pude encontrar mucha ayuda en este asunto. ¿Qué debo hacer para que populate_obj() funcione?

+0

Necesita describir qué error está recibiendo, o cómo los resultados que obtiene difieren de sus expectativas. –

+0

Tenía la esperanza de que si alguien me indicara qué debo guardar donde he escrito ** ¿qué debería colocar aquí? **. También sobre el objeto de usuario obtenido de esa manera se permite pasar o no. – consumer

Respuesta

15

UserForm debe tener request.form pasado para llenarlo con los valores disponibles en la solicitud POST (si corresponde).

form = UserForm(request.form, obj=user) 
+9

Solo con 'WTForms' nativos. El 'request.form' adicional no es necesario con' Flask-WTF'. – Sean

+5

@Sean - Es cierto ... que es parte de por qué 'Flask-WTF' es una buena extensión; ayuda a recortar repetitivo. Pero el OP no usa 'Flask-WTF', por lo que recomendar simplemente que lo use es algo similar a sugerir el uso de jQuery para resolver un problema de JavaScript. Significará que su problema está resuelto para usted, pero el problema está resuelto ** para ** usted ... ** usted ** todavía no sabe cómo resolverlo. Es por eso que solo di al OP la manera de hacer lo que necesita usando Flask y WTForms de una manera escueta (ya has señalado muy bien las ventajas de 'Flask-WTF' y te di un +1 por eso; -)). –

+0

* asiente * La corrección fue más para las cookies de google que cualquier otra cosa. Dicho esto, si un usuario tiene un problema durante el desarrollo (en comparación con el mantenimiento), es más fácil sugerir cosas que le hagan la vida más fácil ahora y más tarde. : ~] – Sean

6

¿Está utilizando Flask-WTF? Si es así, echa un vistazo a la siguiente código de ejemplo:

https://github.com/sean-/flask-skeleton/blob/master/skeleton/modules/aaa/views.py#L13

Específicamente, lo haría:

def edit(): 
    form = UserForm() 
    if form.validate_on_submit(): 
     # Commit your form data 

En pocas palabras, si usted está utilizando Flask-WTF, no estoy seguro de cuál es tu pregunta . Si no está usando Flask-WTF, use Flask-WTF.

+0

"En pocas palabras, si está usando Flask-WTF, no estoy seguro de cuál es su pregunta. Si no está usando Flask-WTF, use Flask-WTF". No puedo estar más de acuerdo con esa última frase. Si no usa Flask-WTF, use Flask-WTF. – Depado

+1

Es bastante difícil ver lo que está sucediendo en ese ejemplo, ya que está haciendo cosas SQLA personalizadas en lugar de simplemente un 'db.session.commit()' normal :) –

1

En caso de matraz de WTF, se puede escribir como

form = UserForm(obj=user) 

Thant va a funcionar!

Cuestiones relacionadas