問題
每當我向屬性form.[any-field-name].data寫入資料時,寫入的資料就會出現在表單中,這正是我想要的。但是,如果在呈現表單時在表單欄位中進行了更改,則新值似乎僅存盤在form.[any-field-name].raw_data. form.[any-field-name].data僅顯示在.data用戶有機會在欄位中鍵入新值之前寫入的原始值。
顯然我可以從 中獲取結果.raw_data,但這會破壞擁有表單驗證庫的目的。如何優雅地為用戶預填充表單欄位,同時允許 Flask-WTForms 接受來自這些相同欄位的新資料?
僅供參考:這與典型的“編輯個人資料”路線有點不同,因為我的應用UserVersion每次進行個人資料編輯時都會創建一個新記錄。
燒瓶路線
@app.route("/edit_user", methods=["GET", "POST"])
@login_required
def edit_user_self():
"""Edit user account that is currently logged in."""
# get latest version of currently logged in user
user_version = current_user.user_versions[0]
# instantiate form and fill with existing data
form = EditUserForm()
form.username.data = user_version.username
form.email.data = user_version.email
form.addr_housenumber.data = user_version.addr_housenumber
form.addr_street.data = user_version.addr_street
form.addr_unit.data = user_version.addr_unit
form.addr_city.data = user_version.addr_city
form.addr_state.data = user_version.addr_state
form.addr_postcode.data = user_version.addr_postcode
if not form.validate_on_submit():
return render_template("edit_user.html", form=form)
else:
# create new user version
new_user_version = UserVersion(user=current_user,
username = form.username.data,
password = user_version.password,
email = form.email.data,
addr_housenumber = form.addr_housenumber.data,
addr_street = form.addr_street.data,
addr_unit = form.addr_unit.data,
addr_city = form.addr_city.data,
addr_state = form.addr_state.data,
addr_postcode = form.addr_postcode.data
)
db.session.add(new_user_version)
db.session.commit()
flash("Changes saved")
return redirect("/view_user")
表格模型
class EditUserForm(FlaskForm):
username = StringField(
"Username", validators=[DataRequired(message="Please enter a username")]
)
email = StringField(
"Email",
validators=[
DataRequired(),
Email(message="Please enter a valid email address"),
],
)
addr_housenumber = StringField("Housenumber", validators=[Length(max=80)])
addr_housename = StringField("Housename", validators=[Length(max=80)])
addr_conscriptionnumber = StringField(
"Conscription Number", validators=[Length(max=80)]
)
addr_street = StringField("Street", validators=[Length(max=80)])
addr_place = StringField("Place", validators=[Length(max=80)])
addr_postcode = StringField("Postcode", validators=[Length(max=80)])
addr_city = StringField("City", validators=[Length(max=80)])
addr_country = StringField("Country", validators=[Length(max=80)])
addr_hamlet = StringField("Hamlet", validators=[Length(max=80)])
addr_suburb = StringField("Suburb", validators=[Length(max=80)])
addr_subdistrict = StringField("Subdistrict", validators=[Length(max=80)])
addr_province = StringField("Province", validators=[Length(max=80)])
addr_state = StringField("State", validators=[Length(max=80)])
addr_door = StringField("Door", validators=[Length(max=80)])
addr_unit = StringField("Unit", validators=[Length(max=80)])
addr_floor = StringField("Floor", validators=[Length(max=80)])
addr_block = StringField("Block", validators=[Length(max=80)])
submit = SubmitField("Save")
庫版本
- 燒瓶 1.1.2
- 燒瓶WTForms 0.14.3
- 燒瓶 SQLAlchemy 2.1
uj5u.com熱心網友回復:
為此,我使用占位符。您可以通過以下方式預先填寫 edit_user_self:
form.username.render_kw({'placeholder':user_version.email})
否則你可以在 jinja 中這樣做:
{{wtf.form_field(form.email,
placeholder=user_version.email)}}
但要這樣做,您應該將附加資訊傳遞給 jinja 模板。
uj5u.com熱心網友回復:
你需要交換你的邏輯。首先測驗表單提交并驗證,否則預填充并回傳表單:
@app.route('/submit', methods=['GET', 'POST'])
def submit():
form = MyForm()
if form.validate_on_submit():
#Validate and Process submitted form first:
new_user_version = UserVersion(user=current_user,
username = form.username.data)
db.session.add(new_user_version)
db.session.commit()
return redirect('/success')
user_version = current_user.user_versions[0]
#Pre-populate your form here:
form.username.data = user_version.username
return render_template('submit.html', form=form)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/316061.html
標籤:Python 验证 烧瓶 烧瓶-sqlalchemy 烧瓶wtforms
上一篇:角度-如何禁用類使用(驗證問題)
下一篇:手機號碼前會自動添加國家代碼
