带参数的烧瓶url_for()

时间:2018-09-25 16:21:11

标签: python postgresql flask jinja2 url-routing

我正在学习Flask,我被困在这里。

如何为带有参数(parameter)的搜索结果建立链接?

我的应用搜索书籍,并仅使用Flask和Jinja2将书籍呈现在HTML页面上。

所以我的HTML仅具有此功能:

 <ul>
   {% for x in lk1 %}
      <li><a href="{{ url_for('bookPage'}}">{{ x[2] }}   (by) {{ x[3] }}  (year) :  {{ x[4] }}</a></li>
   {% endfor %}
 </ul>
  

其中lk1是Flask从SQL收集的书籍清单   和x是来自SQL数据库的原始信息

页面bookpage.html中的内容为空,我需要传递带有URL的参数,以便可以在页面上呈现它们或获取有关此书的其余信息,也可以在书本页面中呈现它,如果可以的话我了解如何根据我的代码将书名的网址设为{{ x[2] }} 我看到ppl做着<url_titl>之类的事情,但我不知道它是如何工作的

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为,您必须学习有关使用flask和jinja创建变量url的信息。

可变网址示例。

HTML

<ul>
    {% for x in lk1 %}
      <li><a href="{{ url_for('bookPage', title=x[2] }}">{{ x[2] }}   (by) {{ x[3] }}  (year) :  {{ x[4] }}</a></li>
    {% endfor %}
</ul>

Python

@app.route('/books/<title>' )
# the name of this function have to be used in 
# url_for ('nameOfFunction',  name_of_variable_part_of_url=some_internal_variable)
def bookPage(title):
     # code, that will creat yourlist
     # book.html - template for book
     # listofvariables - variables for book's page
     # 
     return render_template ("book.html", listofvariables=yourlist)

链接到类似问题:Reference template variable within Jinja expression

更新:要在网址中使用许多变量,您必须更改html和python。

HTML:

<a href="{{ url_for('bookPage', title=x[2], heading=x[3]) }}">all your text </a>

Python:

@app.route('/books/<title>-<heading>' ) 
def bookPage(title, heading):

答案 1 :(得分:0)

@app.route('books', methods=['GET', 'POST')
def books():
    book_list = Book.query.all()
    return render_template('books.html', book_list=book_list)

模板;

<ul>
{% for x in book_list %}
    <li><a href="{{ url_for('bookpage', title=x.title, book_id=x.id }}">{{ x.title }}   (by) {{ x.author }}  (year) :  {{ x.year }}</a></li>
{% endfor %}
</ul>

要获取带有标题的网址,您的查看功能应如下所示。书id很重要,因为书可以具有相同的标题,因此不能用作唯一的标识符。

@app.route('bookpage/<int:book_id>/<string:title>', methods=['GET', 'POST')
def bookpage(title=None, book_id=None):

我建议您使用Flask-SQLAlchemy并将Book作为对象,如下所示,您将能够访问Jinja模板中显示的属性。

class Book(db.Model):
    id = db.Column(db.Integer, db.ForeignKey)
    title = db.Column(Text)
    author = db.Column(Text)

如果您要访问书籍页面,则可以使用“一对多”的书籍和页面模型,即,如果您要上载内容,则一本书可以包含许多页面。