今天要来接续制作表单,会以昨天的内容再延伸出更多新的功能。
昨天有了登入和注册,今天就来加上使用者设定的表单。
class UserSettingForm(FlaskForm):
password = PasswordField(
"Password",
render_kw={"placeholder": "Password"},
)
email = EmailField(
"Email", validators=[DataRequired()], render_kw={"placeholder": "Email"}
)
submit = SubmitField("Update")
def validate_password(self, field):
if type(field.data) is str:
if field.data != "" and len(field.data) < 6:
raise ValidationError(
"The password must contain at least 6 characters."
)
else:
raise ValidationError("Invalid type.")
他也有三个栏位,分别是密码、电子邮件、送出。前面的设定基本上都跟昨天差不多,比较特殊的是最後面的 validate_password
。
昨天讲了很多 validators
,而 validate_password
也可以算是一个,只是他会用一个函式的方式来处理。他的函式名称并不像看起来这麽简单,password
指的不只是我们语意上的密码,同时也是我们上面定义的 password
栏位。Flask-WTF 可以用这种 validate_{field_name}
函式来做一些没办法用一般他提供的 validator 的验证,而它里面的 field
就是指定的栏位,以此处为例就是 self.password
。
因为这个表单是二合一的,使用者可能只想改密码或是电子邮件,所以我们不会让他 DataRequired
(email
有的原因是我们到时候会直接把电子邮件送到前端显示,但密码不能这样做),但是密码还是有它该验证的东西,所以我们加上这个函式来处理。他首先判断他的型别是否正常,接着看看他是不是空字串,如果是的话就不要理他,这代表他没有要改的意思;如果不是的话,那就要看看他是不是有超过六码。这里有一个 ValidationError
,他要从 wtforms.validators
引入,跟昨天那一堆 validator 同一个地方,而他参数的字串就是要显示的讯息。
接着来看看管理员的新增使用者表单。
class AddUserForm(FlaskForm):
username = StringField(
"Username",
validators=[
DataRequired(),
Length(min=4, max=30, message="The name should be 4 to 30 letters long."),
Regexp(
"[a-zA-Z0-9_]+",
message="Only letters, numbers and underscore are allowed in username.",
),
],
render_kw={"placeholder": "Username"},
)
password = PasswordField(
"Password",
validators=[
DataRequired(),
Length(min=6, message="The password must contain at least 6 characters."),
],
render_kw={"placeholder": "Password"},
)
email = EmailField(
"Email", validators=[DataRequired()], render_kw={"placeholder": "Email"}
)
is_admin = BooleanField("The user is an admin")
submit = SubmitField("Add")
跟之前注册的很像,比较特别的是他有一个 BooleanField
,他到了 HTML 会变成常见的 checkbox
,就可以让管理员透过这个来调整要不要让使用者变成管理员。而他需要另外引入,跟前面都不太一样,他要从 wtforms.fields.core
引入。
最後要来看到新增贴文和留言的表单。
class AddPostForm(FlaskForm):
title = StringField("title", validators=[DataRequired()])
description = StringField("description")
content = PageDownField("Enter your markdown")
submit = SubmitField("Submit")
class AddCommentFrom(FlaskForm):
content = StringField("Comment", render_kw={"placeholder": "Comment"})
submit = SubmitField("Comment")
留言的表单没甚麽好说,非常简单易懂。比较特别的是贴文的表单,我们用了一个新东西 PageDownField
,他允许我们边编辑边看 markdwon 长甚麽样子,这个东西现在不会解释,会等到写 HTML 的时候再来处理。
Flask实作 ext 13 Flask-Markdown
BooleanField
<<: Day19:[排序演算法]Bubble Sort - 气泡排序法
>>: [Day19] NLP会用到的模型(三)-RNN应用
Python定义函式有几种方法 Class函式 def函式 我们今天先介绍def函式。 先来解释函式...
前言 因为UI和UX方面的需求,这几天上网搜寻了如何自定义下一页的弹出大小,弹出位置和动画,发现有蛮...
tags: OC 30 day 为什麽放这张图?应为我觉得MRC就像是古老的仪式。既然MRC已经没什...
我们能够做完一个网页後,接下来我们可以让这个网页有更多的动态、趣味性,今天要介绍的动画效果trans...
$("#select_div").hide(); //把id="sel...