2017-06-21 23 views
0

これはコードです。私はクラスItemがあるモデルを持っています。作成した投稿をFlaskの独自のビューに渡すにはどうすればいいですか?

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']? 

私は何とか独立してアイテムを渡すと思いますか?必要に応じてタイトルやコンテンツ、カテゴリなど私は本当にわからない。また

それは直接あなたのエラーに関連していない

def create(): 
    # ... 
    return redirect(url_for('view', item=item)) 

注:

答えて

1

があなたの代わりにrender_template機能のごurl_for機能でitemパラメータを含める必要がありますが世話をする必要がありますItemオブジェクトviewエンドポイントのrender_template()関数に渡します。現時点ではアイテムタイトルを渡すだけです。これは、オブジェクト全体を渡すcreateエンドポイントでの処理方法と矛盾しています。私はあなただけのタイトルではなく、アイテムオブジェクトのすべてのプロパティを使用すると仮定します。

追加すると、あなたのアイテムのタイトルが時間の経過と共に変化するか、または重複があるかもしれないが、IDは一意にとどまるので、主キー(id)をタイトルとして識別子として使用する方がずっと優れています。私の提案された変更:

@app.route('/view/<itemid>') 
def view(itemid): 
    item = Item.query.filter(itemid).first_or_404() 
    return render_template('view.html', item=item) 
+0

あなたが考えている作成機能コード全体を投稿できますか?あなたがこのリダイレクトがif request.method == 'POST'ロジックに入るべきであるということを意味するかどうかはわかりません。 (それは既にある)、または関数が返るように外部にある。リクエストがポストかゲット権かどうかに関係なく、同じリターンになるので混乱します。この場合、どこで商品を手に入れますか?現在、外側のループでは、私が持っているのはフォームオブジェクト – BigBoy1337

+0

です。決して気にしません。私はパラメータがurl_forで渡されたことを忘れました、リダイレクト部分ではありません。私はあなたがrender_template関数の代わりにあなたが言ったときにあなたがタイプミスをしたと思いますか? – BigBoy1337

関連する問題