使用相同的表单来创建和更新但不同的验证逻辑

时间:2017-06-22 15:25:16

标签: python flask wtforms flask-wtforms

我有一个FlaskForm类,我可以验证字段值是否已经在系统中,并在需要时引发ValidationError。

re.findall(r'\d+\.?\d*',str)

对于User,我最终实际上不得不使用不同的验证来执行单独的Form类来启用更新模型。

['8', '52', '30', '52', '2', '0.5']

但是现在我需要使用另一个我无法从Form类访问的模型,因为它不依赖于用户(它取决于正在编辑的记录)。我不确定如何进行此验证,如果可能的话,我不希望这些模型有两个FlaskForm类。

有没有办法将某些验证方法仅应用于某个操作(创建与更新),还是我必须为每个具有必须唯一的字段的模型编写多个FlaskForm类?

我认为这种设计模式必须经常出现,但无法找到处理它的好例子。

1 个答案:

答案 0 :(得分:1)

每个型号可以使用一个FlaskForm。这是用户模型的表单类:

class UserForm(FlaskForm):
    """
    Form to add or edit a user
    """

    username = StringField('username', validators=[DataRequired()])
    password = StringField('password', validators=[DataRequired()])
    ...

然后在views.py中执行此操作:

@app.route('/user/add', methods=['GET', 'POST'])
@login_required
def add_user():
    """
    Add a user to the database
    """

    add_user = True

    form = UserForm()
    if form.validate_on_submit():
        user = User(...)
        ...
        # store the user in the db

    return render_template('/.../user.html', action="Add",
                   add_user=add_user, form=form,
                   title="Add User")


@app.route('/user/edit/<int:id>', methods=['GET', 'POST'])
@login_required
def edit_user(id):
    """
    Edit a user
    """

    add_user = False

    user = User.query.get_or_404(id)
    form = UserForm(obj=user)

    if form.validate_on_submit():
        user.username = form.username.data
        ...
        # Here you can check whether new name of the user corresponds
        # already existing user
        ...


return render_template('/.../user.html', action="Edit",
                       add_user=add_user, form=form,
                       user=user, title="Edit User")

这就是您的user.html模板的外观:

<div class="...">
    {% if add_user %}
        <h1>Add User</h1>
    {% else %}
        <h1>Edit User</h1>
    {% endif %}
    <br/>
    <form action="" method="post" class="form">
      {{ form.hidden_tag() }}
      {{ wtf.form_errors(form, hiddens="only") }}
      {{ wtf.form_field(form.username) }}
      {{ wtf.form_field(form.password) }}
      ...

      <div class="form-group">
        <input type="submit" value="Submit" class="btn btn-default">
        <a href="{{ url_for('app.list_users') }}" class="btn btn-default">
          Back 
        </a>
      </div>
    </form>
</div>

您使用布尔值add_user来区分添加或编辑现有用户。可能没有必要为此编写单独的验证器。

希望这有帮助。