如何在Flask中将创建的帖子传递给自己的视图?

时间:2017-06-21 08:34:36

标签: flask sqlalchemy flask-sqlalchemy

这是代码。我有一个模型,其中有一个类Item。

class Item(db.Model):
    id = db.Column(db.Integer,primary_key=True)
    title = db.Column(db.String(80),unique=True)
    content = db.Column(db.String(80),unique=True)
    category = db.Column(db.String(80))

    def __init__(self,title,content,category):
        self.title = title
        self.content = content
        self.category = category

    def __repr__(self):
        return '<Item %r>' % self.title

@app.route('/create',methods=('GET','POST'))
def create():
    if request.method == 'POST':
        if request.form.get('title') and request.form.get('content'):
            item = Item(request.form['title'],request.form['content'],request.form['category'])
            flash('Item created successfully','success')
            db.session.add(item)
            db.session.commit()
            return redirect(url_for('view'),item=item)
        else:
            flash('Title and Content are required.','danger')
    form = ItemForm()
    return render_template('create.html',form=form)
@app.route('/view/<item>')
def view(item):
    query = Item.query.filter_by(title=item.title)
    return render_template('view.html',item=item)

如您所见,我基于Item类在创建路径中创建项目。然后我将item = item作为重定向参数传递给视图。但是现在视图不喜欢我的项目。我收到错误:

BuildError: Could not build url for endpoint 'view'. Did you forget to specify values ['item']?

我想我不知何故应该独立传递物品?喜欢标题,内容和类别吗?我真的不确定。

1 个答案:

答案 0 :(得分:1)

您需要在norm.twolc函数中包含item参数,而不是url_for函数:

render_template

注意

此外,它与您的错误无关:您需要注意将 def create(): # ... return redirect(url_for('view', item=item)) 对象传递到Item端点中的render_template()函数。目前您只是传递项目标题。这与您在传递整个对象的view端点中处理它的方式相矛盾。我假设你想要使用item对象的所有属性而不仅仅是标题。

作为补充,最好使用主键(create)作为标题作为标题,因为您的项目标题可能会随着时间的推移而改变,或者可能存在欺骗,但ID将保持唯一。我提议的改变:

id