Day 19 实作表单 (2)

前言

今天要来接续制作表单,会以昨天的内容再延伸出更多新的功能。

UserSettingForm

昨天有了登入和注册,今天就来加上使用者设定的表单。


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 同一个地方,而他参数的字串就是要显示的讯息。

AddUserForm

接着来看看管理员的新增使用者表单。

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 引入。

posts & comments

最後要来看到新增贴文和留言的表单。


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 的时候再来处理。

References

Flask实作 ext 13 Flask-Markdown
BooleanField


<<:  Day19:[排序演算法]Bubble Sort - 气泡排序法

>>:  [Day19] NLP会用到的模型(三)-RNN应用

Day5:def函数

Python定义函式有几种方法 Class函式 def函式 我们今天先介绍def函式。 先来解释函式...

[Cmoney 菁英软件工程师战斗营] IOS APP 菜鸟开发笔记(7)----自定义弹出视窗

前言 因为UI和UX方面的需求,这几天上网搜寻了如何自定义下一页的弹出大小,弹出位置和动画,发现有蛮...

# iOS APP 开发 OC 第十八天,MRC 实作

tags: OC 30 day 为什麽放这张图?应为我觉得MRC就像是古老的仪式。既然MRC已经没什...

Day23 CSS转场动画Transition

我们能够做完一个网页後,接下来我们可以让这个网页有更多的动态、趣味性,今天要介绍的动画效果trans...

把id隐藏/显示

$("#select_div").hide(); //把id="sel...