我正在使用 WTForms。我正在对文件上传应用验证,并将其限制为仅 jpg、png 和 pdf 格式。但是,如果我输入不正确,则不会出现错误消息。
我遵循了本教程 https://flask-wtf.readthedocs.io/en/stable/form.html
photo = FileField('photo', validators=[
FileRequired(),
FileAllowed(['png', 'pdf', 'jpg'], "wrong format!")
])
Run Code Online (Sandbox Code Playgroud) 我正在创建一个小型企业门户网站。将会有一个计算机数据库,其中包含有关公司中所有计算机的信息。我正在创建一个 WTForm 用于编辑计算机的属性。我有一个页面,其中包含包含计算机属性的表格。每行都有特殊的按钮。当用户按下其中一个时,我想显示一个带有从数据库获取默认值的表单的页面。当我在视图函数中编辑默认值时,出现错误:
\n\nThe CSRF token is missing.\nRun Code Online (Sandbox Code Playgroud)\n\n我的查看功能:
\n\ndef edit_computer(computer_id):\n if admin_can() or sysadmin_can():\n computer = models.Computer.query.filter_by(id=computer_id).one()\n user = models.User.query.filter_by(id=computer.user_id).one()\n email = user.email\n\n form = forms.EditComputerForm()\n form.email.default = user.email\n form.type_.default=computer.type_\n form.model.default = computer.model\n form.cpu.default = computer.cpu\n form.ram.default = computer.ram\n form.rom.default = computer.rom\n form.os.default = computer.os\n form.supplements.default = computer.supplements\n form.process()\n\n if form.validate_on_submit():\n ...\nRun Code Online (Sandbox Code Playgroud)\n\n当我不设置默认值时(删除此 \xe2\x86\x93),代码工作正常
\n\nform.email.default = user.email\nform.type_.default=computer.type_\nform.model.default = computer.model\nform.cpu.default = computer.cpu\nform.ram.default = computer.ram\nform.rom.default = computer.rom\nform.os.default = computer.os\nform.supplements.default = computer.supplements\nform.process()\nRun Code Online (Sandbox Code Playgroud)\n\n形式:
\n\nclass EditComputerForm(FlaskForm): …Run Code Online (Sandbox Code Playgroud) 我正在寻找 wtforms 的 SelectField 和 Textfield 之间的混合,其中可以输入一个经过验证并从给定选项列表自动完成的字符串,例如 SearchField 中的选择参数。
目前我有这个实现,它只是一个下拉菜单,但我希望用户能够输入任何字符串。输入字符串时,所有匹配选项都应显示在下拉列表中,就像谷歌搜索栏中一样。
possible_names = {0:'hans', 1:'sepp', 3:'max'}
class ReusableForm(Form):
name = SelectField("Enter a Name",
choices=[(uuid, name) for uuid, name in possible_names.items()],
validators=[validators.InputRequired()])
Run Code Online (Sandbox Code Playgroud) 我如何比较烧瓶中的两个密码?我需要在哪里这样做:在课堂上还是在request.method ==“POST”中?谢谢!
class ContactForm(FlaskForm):
email = StringField(label='E-mail', validators=[
validators.Length(min=5, max=35), validators.Email()
])
password = StringField(label='Password', validators=[
validators.Length(min=6, max=10)
])
password_confirm = StringField(label='Password confirm', validators=[
validators.Length(min=6, max=10)
])
def validate_name(form, field):
if len(field.password.data) != len(field.password_confirm.data):
raise ValidationError('Passwords must be equal')
Run Code Online (Sandbox Code Playgroud) 我花了几天时间试图让 WTForms 来验证我的request.args,但我就是无法form.validate()返回True。
我的想法是,我有一个简单的文本字段,用于 WTForm 中的用户输入,如下所示。
表格.py
class SearchForm(FlaskForm):
q = StringField('q',
validators=[])
search = SubmitField('Search')
def validate_q(self, q):
if q.data not in allowed_values: #"allowed_values" is just a list I want to check against
raise ValidationError('')
Run Code Online (Sandbox Code Playgroud)
搜索.html
<form method="GET" action="{{ url_for('finance.search') }}">
<div class="col-9 col-md-5 p-0 m-0">
{% if form.q.errors %} {{ form.q(class="form-control form-control-md is-invalid") }}
<div class="invalid-feedback">
{% for error in form.q.errors %}
<span>{{ error }}</span> {% endfor %}
</div>
{% else %} …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Flask-WTForm 的 FileField 上传图片。但即使我上传了图片,它也无法检测到。
表单创建为:
class User_settings_profile_picture_form(FlaskForm):
picture = FileField('Update profile picture', validators=[DataRequired(), FileAllowed(['jpg', 'png', 'jpeg', 'gif'])])
submit = SubmitField('Update')
Run Code Online (Sandbox Code Playgroud)
使用该表单的路线如下:
profile_pic_form = User_settings_profile_picture_form()
.
.
.
if profile_pic_form.validate_on_submit():
if profile_pic_form.picture.data:
...
else:
#for debugging purposes
print("Is valid: " + profile_pic_form.validate())
print("Errors: " + profile_pic_form.errors)
print("Request files: " + request.files)
Run Code Online (Sandbox Code Playgroud)
这些print语句用于调试目的,在控制台中它类似于:
Is valid: False
Errors: {'picture': ['This field is required.']}
Request files: ImmutableMultiDict([])
Run Code Online (Sandbox Code Playgroud)
html 看起来像:
<form method="POST" action="">
{{ profile_pic_form.hidden_tag() }}
<div class="mb-3">
<h3>Profile Picture</h3>
{{ …Run Code Online (Sandbox Code Playgroud) 我做了一个像这样的SelectField:
# constants.py
QUESTION_LIST = {}
QUESTION_LIST['QuestionOne'] = { 'disagree-strong': "Strongly Disagree", 'agree-strong': "Strongly Agree" }
#forms.py
from constants import *
typeone = SelectField('QuestionOne',
choices=QUESTION_LIST['QuestionOne'].iteritems(),
description='Answer the question')
Run Code Online (Sandbox Code Playgroud)
因此,当您加载页面时,它会显示选项.我选择了这个选项,然后按"提交"并显示"这不是一个有效的选择",它会清除选择字段.
然后,当您刷新页面时,就好像代码被破坏而且它不再显示选择......这是一个空的下拉/选择字段.
我究竟做错了什么?
编辑:出于某种原因,当你把iteritems放在视图而不是表单时,一切正常.Flask-WTF的某种怪癖,如果你不使用他们的格式,它似乎在你提交表格后删除了选择.
因此,我在将Flask会话对象的列表传递到正在使用的WTForms中时遇到问题。我正在尝试访问会话对象内的“策略”对象(这是一个列表)。
目标是列出与当前用户关联的所有策略。
在Flask应用中:
class Create_Indicator_Form(Form):
security = TextField('Ticker Name', [
validators.Required(),
validators.Length(min=1, max=6)])
mva_10 = BooleanField('10 day moving average')
mva_25 = BooleanField('25 day moving average')
strategy = SelectField('strategy', session['strategy'])
def validate_mva_10(form, field):
if form.mva_25.data is True and field.data is True:
raise ValidationError('You can only choose one reference')
if form.mva_25.data is False and field.data is False:
raise ValidationError('You must choose at least one reference')
@app.route('/create_indicator', methods=['GET', 'POST'])
def create_indicator():
check_if_logged_in()
f = request.form
create_indicator_form = Create_Indicator_Form(f)
if request.method == 'POST' and …Run Code Online (Sandbox Code Playgroud) 我似乎无法弄清楚如何CheckboxInput在我的模板中渲染WTForms .当我尝试使用我的Jinja模板中的Flask渲染字段时,我收到此错误:
TypeError:call()只需要2个参数(给定1个)
该错误与{{ form.prefs(value='n') }}我的模板中使用的方式有关.WTForms文档中CheckBoxInput说"默认情况下,value = HTML属性为'y',除非在渲染时由value =另行指定." 无论是否指定值,我都会收到错误.
我似乎无法找到如何呈现简单的CheckBoxInput的示例.任何帮助表示赞赏.
这是我的表格:
class PreferencesForm(Form):
prefs = widgets.CheckboxInput()
Run Code Online (Sandbox Code Playgroud)
这是我的模板:
{% extends "base.html" %}
{% block content %}
<form method="POST" action="/user/prefs/">
<div>{{ form.prefs(value='n') }}</div>
<button type="submit" class="btn">Submit</button>
</form>
{% endblock %}
Run Code Online (Sandbox Code Playgroud) 我的数据库是Postgres实例。我的模型定义为:
from app import db
class Device(db.Model):
__tablename__ = 'device'
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String())
Run Code Online (Sandbox Code Playgroud)
我的来源定义为:
from flask_wtf import FlaskForm
from wtforms import StringField
class EditDevices(FlaskForm):
device_name = StringField("Device Name", validators=[])
submit = SubmitField['Submit']
Run Code Online (Sandbox Code Playgroud)
我收到以下形式的错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) can't adapt type 'StringField' [SQL: 'UPDATE device SET name=%(name)s WHERE device.id = %(device_id)s'] [parameters: {'name': <wtforms.fields.core.StringField object at 0x110580c18>, 'device_id': 208}]
Run Code Online (Sandbox Code Playgroud)
任何想法,我要去哪里错了?
flask ×10
wtforms ×10
python ×8
dictionary ×1
filefield ×1
html ×1
jinja2 ×1
postgresql ×1
python-3.x ×1
session ×1
validation ×1