Flask學習記錄之Flask-WTF

Flask-wtf時Wtforms庫的flask框架擴展,可以方便的處理Web表單html

一.定義一個web表單

使用flask-wtf時,每一個web表單都由一個繼承自flask.ext.wtf.Form的類表示,每一個字段都由類中的屬性表示,每一個字段能夠附屬多個驗證函數web

from flask.ext.wtf import Form
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import  DataRequired,EqualTo

class RegForm(Form):
    username = StringField('Username',validators=[DataRequired()])
    password = PasswordField('password', validators=[DataRequired()])
    password1 = PasswordField('confirm password', validators=[DataRequired(),
                                                              EqualTo('password', 'password not match')
                                    ]) submit
= SubmitField("submit")

這裏定義了一個註冊用戶的表單,password1須要與password填寫同樣,字段的第一個屬性是表單名,在validators中能夠使用不一樣的驗證器數據庫

 

二.使用表單

向模版中傳入一個表單實例來渲染表單flask

@app.route('/reg', methods=('GET', 'POST'))
def reg():
    form = RegForm()
    #驗證表單輸入內容是否符合要求
    if form.validate_on_submit():
        #獲取表單提交的內容
        return  "name:%r,password:%r"%(form.username.data,form.password.data)
    return render_template('reg.html', form=form)    

模版中bootstrap

 <form action="" method="post" name="login">
        {{form.hidden_tag()}}
        <p>
            Please enter your Name:<br>
            {{form.name(size=80)}}<br>
        </p>
        <p>
            Password:<br>
            {{ form.password }}
        </p>
         <p>
            Password:<br>
            {{ form.password1 }}
        </p>
        <p>{{ form.submit }}</p>
    </form>

form.hidden_tag() 模板參數將被替換爲一個隱藏字段,用來是實如今配置中激活的 CSRF 保護。若是你已經激活了 CSRF,這個字段須要出如今你全部的表單中。app

 

Flask-Bootst 提供了快捷的表單顯示函數,如可直接使用:框架

{% extends 'base.html' %}
{% import 'bootstrap/wtf.html' as wtf%}
{% block page_content %}

{{ wtf.quick_form(form) }}

{% endblock %}

三.自定義表單驗證

能夠自定義表單的驗證方式,好比若是數據庫已經有了一個用戶名就不能再註冊同名的用戶了,函數

....
from wtforms import ValidationError
....
class RegForm(Form):
....
    #驗證username字段時會自動調用這個函數
    def validate_username(self,field):
        if field.data == 'agmcs':
            #拋出的異常提示可做爲提示顯示
            raise ValidationError("the username is already exist")

 四.Select控件的使用

class EditProfileAdminForm(Form):
    role = SelectField('Role', coerce=int)
    #在構造化Form實例時指定selectField的choices內容,
    def __init__(self, *args, **kwargs):
        super(EditProfileAdminForm, self).__init__( *args,
                                                   **kwargs)
        self.role.choices = [(role.id, role.name) for role in Role.query.order_by(Role.name).all()]
#choices須要一個列表裏面包含數個鍵值對應的元組

#也能夠在初始化後使用form.role.choices =  [(role.id, role.name) for role in Role.query.order_by(Role.name).all()] 來添加選項

 沒有使用Flask-bootstrap的話能夠使用以下代碼顯示:post

<div class="form-group" id='cg-{{form.role.id}}'>
   {{form.role.label(class='col-lg-2 control-label',for=form.role.id)}}
   <div class="col-lg-9">
     {{form.role(class='form-control')}}
     <span class="help-block" id='hl-{{form.role.id}}'></span>
   </div>
</div

 五.自定義表單的屬性

剛纔須要在flask-admin中替換TextArea爲CKEDitor,這樣就只能在代碼中替換,但是ckeditor須要將textarea的class設置成ckedtor,上網查了一下,能夠本身定義一個控件屬性ui

明天寫//

相關文章
相關標籤/搜索