2014-04-08 8 views
8

Hier ist mein HTML-Dropdown-Menü. Der Wert ist der Primärschlüssel der Kindtabelle.Ein vollständiges Many-to-One-Beispiel mit Flask, WTForm, SQLAlchemy und Jinja2

Ich muss Post.category_id mit dem Wert Integer 1 anstelle von "Kategorie Nummer Eins" aktualisieren. Hier ist mein Code.

# 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, 
        body=form.body.data, 
        pub_date=form.pub_date.data, 
        cateogry_id=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) 

ich, damit ich habe versucht ...

cateogry_id=form.category.data 
cateogry_id=form.category.value 

Nun wäre das nicht schön!

+0

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

Antwort

7

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!

Verwandte Themen