问题与SelectField
选项的使用有关,在该选项中,我想将数据库中的所有俱乐部提供给使用,并在填写表格时接受所选俱乐部。
在表格上正确提供了俱乐部列表,但是当选择了某个俱乐部并单击了提交按钮时,我会收到以下消息:
“ TypeError:'NoneType'对象不可迭代”消息。
我的路线代码:
@bp.route('/register', methods=['GET', 'POST'])
def register():
if current_user.is_authenticated:
return redirect(url_for('main.index'))
clubs = []
form = RegistrationForm()
if form.validate_on_submit():
clubnumber = int(form.club.data) +1
usernumber = clubnumber * 1000000
nextuser = (db.session.query(func.max(User.usernum)).filter(User.usernum<usernumber).scalar() or 0)
print(nextuser)
nextuser = nextuser +1
user = User(username=form.username.data, email=form.email.data, usernum=nextuser,club=form.club.data)
user.set_password(form.password.data)
db.session.add(user)
db.session.commit()
flash(_('Congratulations, you are now a registered user! %(nextuser)s!'))
return redirect(url_for('auth.login'))
elif request.method == 'GET':
clubrows = Club.query.all()
for club in clubrows:
clubs.append(club.clubnum)
clubs.append(club.clubname)
form.club.choices = [(row.clubnum, row.clubname) for row in Club.query.all()]
return render_template('auth/register.html', title=_('Register'), form=form)
我的表单代码:
class RegistrationForm(FlaskForm):
username = StringField(_l('Username'), validators=[DataRequired()])
email = StringField(_l('Email'), validators=[DataRequired(), Email()])
password = PasswordField(_l('Password'), validators=[DataRequired()])
password2 = PasswordField(
_l('Repeat Password'), validators=[DataRequired(),
EqualTo('password')])
club =SelectField(_l('Club' ))
submit = SubmitField(_l('Register'))
def validate_username(self, username):
user = User.query.filter_by(username=username.data).first()
if user is not None:
raise ValidationError(_('Please use a different username.'))
def validate_email(self, email):
user = User.query.filter_by(email=email.data).first()
if user is not None:
raise ValidationError(_('Please use a different email address.'))
收到完整的错误文本:
[2019-09-29 12:40:41,359] init 中的信息:微博启动* 在http://127.0.0.1:5000/上运行(按CTRL + C退出) 127.0.0.1--[2019年9月29日12:40:47]“ GET / auth / register HTTP / 1.1” 200-
[2019-09-29 12:41:09,845]应用程序错误:/ auth / register上的异常 [POST]
回溯(最近通话最近):文件 “ C:\ Users \ tribl \ PycharmProjects \ CM2020 \ venv \ lib \ site-packages \ flask \ app.py”, wsgi_app中的第2446行 响应= self.full_dispatch_request()
文件 “ C:\ Users \ tribl \ PycharmProjects \ CM2020 \ venv \ lib \ site-packages \ flask \ app.py”, 1951行,在full_dispatch_request中 rv = self.handle_user_exception(e)
文件 “ C:\ Users \ tribl \ PycharmProjects \ CM2020 \ venv \ lib \ site-packages \ flask \ app.py”, 第1820行,在handle_user_exception中 重新提高(exc_type,exc_value,tb)
文件 “ C:\ Users \ tribl \ PycharmProjects \ CM2020 \ venv \ lib \ site-packages \ flask_compat.py”, 第39行,加价 提高价值
文件 “ C:\ Users \ tribl \ PycharmProjects \ CM2020 \ venv \ lib \ site-packages \ flask \ app.py”, 1949行,在full_dispatch_request中 rv = self.dispatch_request()
文件 “ C:\ Users \ tribl \ PycharmProjects \ CM2020 \ venv \ lib \ site-packages \ flask \ app.py”, 1935行,在dispatch_request中 返回self.view_functionsrule.endpoint
文件“ C:\ Users \ tribl \ PycharmProjects \ CM2020 \ app \ auth \ routes.py”, 第54行,在寄存器中 如果是form.validate_on_submit():
文件 “ C:\ Users \ tribl \ PycharmProjects \ CM2020 \ venv \ lib \ site-packages \ flask_wtf \ form.py”, 第101行,在validate_on_submit中 返回self.is_submitted()和self.validate()
文件 “ C:\ Users \ tribl \ PycharmProjects \ CM2020 \ venv \ lib \ site-packages \ wtforms \ form.py”, 验证中的第310行 返回super(Form,self).validate(extra)
文件 “ C:\ Users \ tribl \ PycharmProjects \ CM2020 \ venv \ lib \ site-packages \ wtforms \ form.py”, 验证中的第152行 如果不是field.validate(自己,额外):文件“ C:\ Users \ tribl \ PycharmProjects \ CM2020 \ venv \ lib \ site-packages \ wtforms \ fields \ core.py”, 第195行,在validate中 self.pre_validate(form)
文件 “ C:\ Users \ tribl \ PycharmProjects \ CM2020 \ venv \ lib \ site-packages \ wtforms \ fields \ core.py”, pre_validate中的第471行 对于v,_在self.choices中选择:
TypeError:“ NoneType”对象不可迭代 127.0.0.1--[2019年9月29日12:41:09]“ POST / auth / register HTTP / 1.1” 500-
答案 0 :(得分:0)
由于File "C:\Users\tribl\PycharmProjects\CM2020\app\auth\routes.py", line 54, in register if form.validate_on_submit():
是您的错误之一,因此您的验证可能有问题。您确定验证器按预期工作吗?也许尝试为这些设置断点。
我过去遇到的另一件事是从一个空列表中选择一个元素。因此,而不是:
user = User.query.filter_by(username=username.data).first()
if user is not None:
raise ValidationError(_('Please use a different username.'))
您可以尝试:
user = User.query.filter_by(username=username.data)
if len(user) > 0:
user = user.first()
else:
raise ValidationError(_('Please use a different username.'))
以及validate_email
的类似内容。
希望这会有所帮助!