簡體   English   中英

Flask:如何在基本jinja2模板中放置表單?

[英]Flask: How do I place Forms in Base jinja2 Template?

我是Flask的新手,正在用搜索工具編寫一個簡單的Flask應用程序。 與google搜索類似,我希望在顯示結果時保留搜索結果頁面中的搜索輸入框。因此,我將搜索表單放置在基本模板中,並從基本模板派生了搜索結果模板,以同時顯示搜索表單和搜索結果。

為此,我做了以下事情:

具有頁面元數據和表單(即使在結果頁面中也應基本存在)的基本模板(base.html)。

<html>
  <head>
    {% if title %}
    <title>{{title}}</title>
    {% else %}
    <title>Search</title>
    {% endif %}
  </head>
  <body>
    <h1>Search </h1>
<form action="/series_search" method="post" name="search">
    {{form.hidden_tag()}}
    <p>
        Please enter query: <br>
        {{form.search(size=10)}}
    </p>
    <p><input type="submit" value="Search"></p>
</form>
<br>
{% block content %}{% endblock %}

  </body>
</html>

派生的模板(derived.html)具有以下代碼,該代碼繼承了基本模板(具有搜索模板):

{% extends "base.html" %}

{% block content %}
<h1>Search Result</h1>
    {% if result %}
    <p> Title: {{result.title}}</p>
    {% else %}
    <p> search not found!!</p>
    {% endif %}
{% endblock %}

並且,在視圖中,以下內容

@app.route('/search', methods = ['POST', 'GET'])
def search():
    form = SearchForm()
    if form.validate_on_submit():
        print "form validated"
        query = form.search.data
        result = Lib.get_result(query)
        return render_template('derived.html', result = result)
    return render_template('search.html',
    title = 'Search',
    form = form)

如果我輸入查詢並提交搜索表單,則會收到以下錯誤消息:

....
....
File "/Users/webapp/app/templates/derived.html", line 1, in top-level template code
    {% extends "search.html" %}
  File "/Users/webapp/app/templates/search.html", line 12, in top-level template code
    {{form.hidden_tag()}}
  File "/Users/webapp/flask/lib/python2.7/site-packages/jinja2/environment.py", line 397, in getattr
    return getattr(obj, attribute)

因此,基本上,在按下“提交”按鈕之后,視圖將呈現派生自base.html的派生的.html。 base.html具有應設置的形式。

  1. 調用派生模板時如何傳遞基本模板的表單對象?
  2. 我的方法適合我想要實現的目標嗎? 如果還有其他問題,請提出建議。

預先謝謝你

您只需要將form關鍵字參數傳遞給其他render_template調用。

return render_template('derived.html', result=result)

相反,應為:

return render_template('derived.html', result=result, form=form)

之所以需要這樣做,是因為Web是無狀態的-呈現的模板未保留在Flask的一側。 將HTML發送到客戶端,然后就Flask而言,一切都已完成。 從服務器的角度來看,POST請求是一個單獨的請求,唯一被調用的是render_template('derived')調用。 創建表單並將其發送到search.html並沒有“記憶”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM