Blog Posts的提交
讓我們從簡單的開始。首頁上必須有一張用戶提交新的post的表單。
首先我們定義一個單域表單對象(fileapp/forms.py):
class PostForm(Form): post = TextField('post', validators = [Required()])
下面,我們把這個表單添加到template中(fileapp/templates/index.html):
<!-- extend base layout -->{% extends "base.html" %} {% block content %}<h1>Hi, {{g.user.nickname}}!</h1><form action="" method="post" name="post"> {{form.hidden_tag()}} <table> <tr> <td>Say something:</td> <td>{{ form.post(size = 30, maxlength = 140) }}</td> <td> {% for error in form.errors.post %} <span style="color: red;">[{{error}}]</span><br> {% endfor %} </td> </tr> <tr> <td></td> <td><input type="submit" value="Post!"></td> <td></td> </tr> </table></form>{% for post in posts %}<p> {{post.author.nickname}} says: <b>{{post.body}}</b></p>{% endfor %}{% endblock %}
到目前為止沒啥新的東西,你可以看到,我們僅僅添加了另一表單,就像我們上一次做的那樣。
最后,功能試圖把所有東西都聯系在一起,并被擴展來處理這個表單(fileapp/views.py):
from forms import LoginForm, EditForm, PostFormfrom models import User, ROLE_USER, ROLE_ADMIN, Post @app.route('/', methods = ['GET', 'POST'])@app.route('/index', methods = ['GET', 'POST'])@login_requireddef index(): form = PostForm() if form.validate_on_submit(): post = Post(body = form.post.data, timestamp = datetime.utcnow(), author = g.user) db.session.add(post) db.session.commit() flash('Your post is now live!') return redirect(url_for('index')) posts = [ { 'author': { 'nickname': 'John' }, 'body': 'Beautiful day in Portland!' }, { 'author': { 'nickname': 'Susan' }, 'body': 'The Avengers movie was so cool!' } ] return render_template('index.html', title = 'Home', form = form, posts = posts)
下面讓我們逐一回顧一下這個功能中的變動:
我們導入了Post和PostForm類 我們接收了來自兩個路徑下的index和視圖的POST請求,因為那就是我們如何接收提交的請求。 當我們通過表單提交到功能視圖后,我們會把新的Post記錄錄入數據庫。然后就像之前做的一樣,通過常規的GET請求來訪問它。 Templat會收到一條額外的內容--表單,所以它會提交給文本域。在我們繼續之前還有最后一點提醒:注意下面我們如何添加一條新的Post請求到數據庫中:
新聞熱點
疑難解答