有人写了一个页面,可以让您一次填写表格并一次执行某项操作,而我正在另一页上使用“批量”功能,该页面需要更少的两个表单字段。
我一直在尝试回收他们的Form对象,而不是定义一个仅稍有不同的新对象。
可以使用文档中的示例对此进行解释: https://flask.palletsprojects.com/en/1.0.x/patterns/wtforms/
表单对象已创建:
from wtforms import Form, BooleanField, StringField, PasswordField, validators
class RegistrationForm(Form):
username = StringField('Username', [validators.Length(min=4, max=25)])
email = StringField('Email Address', [validators.Length(min=6, max=35)])
password = PasswordField('New Password', [
validators.DataRequired(),
validators.EqualTo('confirm', message='Passwords must match')
])
confirm = PasswordField('Repeat Password')
accept_tos = BooleanField('I accept the TOS', [validators.DataRequired()])
有一个端点:
@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm(request.form)
if request.method == 'POST' and form.validate():
user = User(form.username.data, form.email.data,
form.password.data)
db_session.add(user)
flash('Thanks for registering')
return redirect(url_for('login'))
return render_template('register.html', form=form)
和register.html(下面的一部分)
<form method=post>
<dl>
{{ render_field(form.username) }}
{{ render_field(form.email) }}
{{ render_field(form.password) }}
{{ render_field(form.confirm) }}
{{ render_field(form.accept_tos) }}
</dl>
<p><input type=submit value=Register>
</form>
现在说您要创建另一个页面,该页面不需要电子邮件字段,但需要所有其他字段。如果您删除该行:
{{ render_field(form.email) }}
在HTML中,页面将呈现正常状态,但是当用户单击提交时,form.validate()
将为False
,因此将不会提交。
如何为.py文件中的表单对象添加内容,使其忽略无法从浏览器发送过来的字段?
尝试
form.email = "field not needed here"
...在验证步骤之前,但似乎不起作用
答案 0 :(得分:1)
我想您想要这样的东西:
表单对象:
from wtforms import Form, BooleanField, StringField, PasswordField, validators
class CustomForm(Form):
username = StringField('Username', [validators.Length(min=4, max=25)])
password = PasswordField('New Password', [
validators.DataRequired(),
validators.EqualTo('confirm', message='Passwords must match')
])
confirm = PasswordField('Repeat Password')
accept_tos = BooleanField('I accept the TOS', [validators.DataRequired()])
您的新端点,假设我们要创建一个不带电子邮件的用户:
@app.route('/endpoint', methods=['GET', 'POST'])
def register():
form = CustomForm(request.form)
if request.method == 'POST' and form.validate():
user = UserWithoutEmail(form.username.data, form.password.data)
db_session.add(user)
flash('Thanks for registering')
return redirect(url_for('login'))
return render_template('register.html', form=form)
和register.html显示除电子邮件之外的所有内容:
<form method=post>
<dl>
{{ render_field(form.username) }}
{{ render_field(form.password) }}
{{ render_field(form.confirm) }}
{{ render_field(form.accept_tos) }}
</dl>
<p><input type=submit value=Register>
</form>
答案 1 :(得分:0)
我找到了一种适用于here的整洁解决方案
class RegistrationForm2(RegistrationForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
delattr(self, 'email')
我喜欢它,因为它不涉及再次重复整个课程。不知道它是否比.py表单中填充伪造的值或避免定义新的表单更优雅,但还是可行。