Ich habe es herausgefunden! Hier ist meine Lösung. Hoffentlich hilft dieses Writup dem nächsten Typen.
Die Lösung ist, dass die Erweiterung die Arbeit für Sie erledigen lässt! Hier ist ein Arbeitsbeispiel der WT Forms sqlalchemy Erweiterung mit Flask, WTForm, SQLAlchemy und Jinja2. Kurz gesagt, müssen Sie sich nicht um die Kind-ID kümmern, da die Erweiterung automatisch dafür sorgt. Das bedeutet, wenn Sie mit SQLAlchemy Eltern- und Kind-Modellen in einer Eins-zu-viele-Beziehung arbeiten, müssen Sie sich NUR mit dem PARENT befassen.
MODEL
Stellen Sie zunächst Ihr Modell sicher und Beziehungen korrekt sind. Beachten Sie in meinem Beispiel, wie die Beziehungen definiert sind und dass die init des Modells nur CATEGORY ... NOT CATEGORY_ID hat. Mein Fehler war, dass ich das CATEGORY_ID-Feld meines Modells ausfüllen würde. Nee. Die Erweiterung macht es für Sie. In der Tat, wenn Sie versuchen, es manuell zu tun, wie ich es überhaupt nicht funktioniert ....
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(80))
url = db.Column(db.String(120))
body = db.Column(db.Text)
create_date = db.Column(db.DateTime)
pub_date = db.Column(db.DateTime)
pub_status = db.Column(db.Text(80))
author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
author = db.relationship('User',
backref=db.backref('posts', lazy='dynamic'))
category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
category = db.relationship('Category',
backref=db.backref('posts', lazy='dynamic'))
def __init__(self, title, body, category, pub_date=None):
self.title = title
self.body = body
if pub_date is None:
pub_date = datetime.utcnow()
self.category = category
self.pub_date = pub_date
def __repr__(self):
return '<Post %r>' % self.title
class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
description = db.Column(db.String(250))
def __init__(self, name):
self.name = name
def __repr__(self):
return self.name
Zweitens, um die Form überprüfen .... bemerke ich bin mit dem wtfrom sqlalchmey QuerySelectedField und das category_id Feld fehlt ...
FORM
from sprucepress.models import Tag, Category
from flask_wtf import Form
from wtforms.fields import StringField, DateTimeField
from wtforms.widgets import TextArea
from wtforms.validators import DataRequired
from wtforms.ext.sqlalchemy.orm import model_form
from wtforms.ext.sqlalchemy.fields import QuerySelectField
def enabled_categories():
return Category.query.all()
class PostForm(Form):
title = StringField(u'title', validators=[DataRequired()])
body = StringField(u'Text', widget=TextArea())
pub_date = DateTimeField(u'date create')
category = QuerySelectField(query_factory=enabled_categories,
allow_blank=True)
Nun ist die FLASK Routing und Darstellungslogik ... Hinweis in der Post NO category_id wieder! Nur Kategorie nur !!!
FÜHRUNG/VIEW
# create new post
@app.route('/admin/post', methods=['GET', 'POST'])
@login_required # required for Flask-Security
def create_post():
form = PostForm()
if form.validate_on_submit():
post = Post(title=form.title.data, pub_date=form.pub_date.data,
body=form.body.data, category=form.category.data)
db.session.add(post)
db.session.commit()
flash('Your post has been published.')
return redirect(url_for('admin'))
posts = Post.query.all()
return render_template('create_post.html', form=form, posts=posts)
Schließlich ist die Vorlage. Rate mal was, wir erzeugen nur das form.category Feld !!!
TEMPLATE
<form action="" method=post>
{{form.hidden_tag()}}
<dl>
<dt>Title:
<dd>{{ form.title }}
<dt>Post:
<dd>{{ form.body(cols="35", rows="20") }}
<dt>Category:
<dd>{{ form.category }}
</dl>
<p>
<input type=submit value="Publish">
</form>
Das Ergebnis ... diese Lösung verwendet korrekt Kategorie Modell als eine Nachschlagtabelle und ordnet die Reihen Beitrag richtig durch die Kategorie PK ganzen Zahlen in die Beiträge category_id Feld zu schreiben. Yeeeehaww!
Ich löste das Problem ... Ich benutze WT Forms QuerySelectField, so dass mein Fehler dachte ich musste das category_id Feld zum jija2 Template hinzufügen .... Die WTF Erweiterung übernimmt all das für Sie. Also ... Sie müssen sich nur um das Kategoriefeld kümmern. Dies gilt für die Ansicht, die Vorlage und das Modell. – jwogrady