TypeError:“ NoneType”对象不可迭代-表单SelectField问题

时间:2019-09-29 11:54:09

标签: python flask-wtforms

问题与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-

1 个答案:

答案 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的类似内容。

希望这会有所帮助!