2013-05-06 6 views
6

Code in Frage:Rendering-Formen mit Kolben + wtform

from flask import Blueprint, render_template, abort 
from flask.ext.wtf import Form 
import os 
from jinja2 import TemplateNotFound 
from models import Member 
from wtforms.ext.sqlalchemy.orm import model_form 
@simple_page.route('/register') 
def register(): 
    form = model_form(Member, Form) 
    return render_template('register.html', form=form, name="bad") 


class Member(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(50), nullable=False) 
    email = db.Column(db.String(50), nullable=False, unique=True) 

und meiner Ansicht nach:

 <p class="txt11 colorb"> 
     {{ form.name }} 
     </p> 

diese Ausgänge <UnboundField(TextField,(), {u'default': None, u'filters': [], u'validators': [<wtforms.validators.Required object at 0x7f62f59b5590>, <wtforms.validators.Length object at 0x7f62f59b55d0>]})>, nicht ein tatsächliches Feld. Wie bekomme ich eine tatsächliche Form/Feld mit der WTform?

+0

Können Sie Ihre Frage mit den Importen, die Sie verwenden, aktualisieren? –

+0

Ich habe die Importe hinzugefügt – tipu

+1

Von wo importieren Sie 'model_form'? –

Antwort

2

Sie müssen ein bisschen mehr Arbeit tun:

{{ form.name.label }} : {{ form.name()|safe }} 

Oder Sie können diese handy snippet verwenden:

{% macro render_field(field) %} 
    <dt>{{ field.label }} 
    <dd>{{ field(**kwargs)|safe }} 
    {% if field.errors %} 
    <ul class=errors> 
    {% for error in field.errors %} 
     <li>{{ error }}</li> 
    {% endfor %} 
    </ul> 
    {% endif %} 
    </dd> 
{% endmacro %} 

Natürlich machte die HTML anzupassen. Speichern Sie diese Datei irgendwo in Ihrem Verzeichnis templates und dann in Ihrer Hauptvorlage. Hier seine formhelpers.html:

{% from "formhelpers.html" import render_field %} 
<form method=post action="/register"> 
    <dl> 
    {{ render_field(form.name) }} 
    {{ render_field(form.email) }} 
    </dl> 
    <p><input type=submit value=Register> 
</form> 
+0

Ich habe Ihren Vorschlag versucht, ich bekomme: TypeError: 'Unbound Field' Objekt ist nicht aufrufbar. – tipu

11

Sie vorbei ein Formular Klasse keine Form Instanz an der Vorlage. Die model_form-Methode generiert dynamisch eine neue Klasse, die wie jede andere Formularunterklasse wiederverwendet, erweitert und anderweitig verwendet werden kann. Es ist auch völlig unnötig, diese Formularklasse bei jedem Lauf Ihrer Ansicht zu generieren, sodass Sie diesen Aufruf außerhalb Ihrer Ansicht verschieben können.

Sie eine instanziierte Klasse vorbei ist auch, warum man seltsame Verhalten bekommen UnboundField beziehen (das ist, wie WTForms deklarativen Bereich Instanziierung Griffe)

Das Update ist einfach:

MemberForm = model_form(Member, base_class=Form) 

@simple_page.route('/register') 
def register(): 
    form = MemberForm(name=u'bad') 
    return render_template('register.html', form=form) 
+0

Das obige Beispiel funktionierte für mich. Vielen Dank. – jwogrady

1

Ich weiß, das ist ziemlich alt, aber ich hatte das gleiche Problem und ich möchte meine Lösung für zukünftige Bedürfnisse teilen.

Ich habe auch das HTML von "UnboundField" gerendert. mit dem Code nach dem Kampf fand ich heraus, ich verwende:

from wtforms import Form 

Und es ist sieht gut aus, aber wenn Fläschchen mit hatte ich dies zu tun:

from flask.ext.wtf import Form 

mein Problem behoben. Hoffe, es ist geholfen