【问题标题】:A Complete Many-to-One Example Using Flask, WTForm, SQLAlchemy, and Jinja2使用 Flask、WTForm、SQLAlchemy 和 Jinja2 的完整多对一示例
【发布时间】:2014-05-20 15:07:02
【问题描述】:

这是我的 HTML 下拉菜单。该值是子表的主键。

<select id="category" name="category">
   <option selected value="__None"></option>
   <option value="1">Category Number One</option>
   <option value="2">Category Number Two</option>
</select>

我需要更新 Post.category_id 值为整数 1 而不是“第一类”。这是我的代码。

# 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)

我尝试过制作...

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

现在不是很好!

【问题讨论】:

  • 我解决了这个问题......我正在使用 WT Forms QuerySelectField 所以我的错误是认为我需要将 category_id 字段添加到 jija2 模板...... WTF 扩展处理所有这些你。所以......您所要做的就是担心类别字段。这适用于视图、模板和模型。

标签: python flask flask-sqlalchemy wtforms flask-wtforms


【解决方案1】:

我想通了!这是我的解决方案。希望这篇文章能对下一个人有所帮助。

解决方案是让扩展为您完成工作!这是一个使用 Flask、WTForm、SQLAlchemy 和 Jinja2 的 WT Forms sqlalchemy 扩展的工作示例。简而言之,您无需担心子 ID,因为扩展程序会自动处理它。这意味着当您以一对多关系处理 SQLAlchemy 父模型和子模型时,您只需处理父模型。

型号

首先,确保您的模型和关系是正确的。请注意在我的示例中,关系是如何定义的,并且模型的 init 只有 CATEGORY...而不是 CATEGORY_ID。我的错误是认为我会填充模型的 CATEGORY_ID 字段。没有。扩展程序为您完成。事实上,如果你像我一样尝试手动操作,它根本就行不通....

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

其次,查看表单...注意我正在使用 wtfrom sqlalchmey QuerySelectedField 并且没有 Category_ID 字段...

表格

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)

现在是 FLASK 路由和视图逻辑......再次注意帖子 NO category_id!仅限类别!!!

路由/视图

# 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)

最后是模板。你猜怎么着,我们只生成form.category字段!!!

模板

  <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>

结果...此解决方案正确地将 Category 模型用作查找表,并通过将 Category PK 整数写入 Posts Category_Id 字段来正确关联 Post 行。哇!

【讨论】:

  • 感谢分享。在 wtforms 文档中确实需要更多这样的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 2022-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多