2017-06-21 48 views
0

這是代碼。我有一個模型,其中有一個類的項目。如何將創建的帖子傳遞給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類的create route中創建了該項目。然後我通過item = item作爲重定向到視圖的參數。但現在這個視圖不喜歡我的物品。我得到的錯誤:

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

我想我不知道應該獨立通過項目件?如需要的標題和內容和類別?我真的不確定。

回答

1

您需要在您的url_for函數代替render_template功能item參數:

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

注意

而且它不直接關係到你的錯誤:你需要照顧在您的view端點中將Item對象傳遞到您的render_template()函數。目前您剛通過產品標題。這與您在傳遞整個對象的端點create中如何處理它是矛盾的。我假設你想使用item對象的所有屬性,而不僅僅是標題。

作爲一個補充,使用主鍵(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

相關問題