如何在Flask中实现布尔表单字段?

问题描述 投票:0回答:1

我(大部分)都遵循Per Wagner Nielsen的优秀教程,但后来尝试(并且失败)在表单中添加一个布尔字段。使用注册表单创建的每个用户似乎都将布尔值设置为True,即使默认值为False并且在表单提交时未选中复选框。我用登录控制器if user.is_admin()中的行测试,控制器确实返回user is admin。我正在显示所有代码,因为我真的没有看到我的错误所在 - 对不起,如果那太多了。任何帮助是极大的赞赏。

app.朋友

from flask import Flask, reque,st, render_template, redirect, url_for, flash, g
from forms import SignupForm, LoginForm
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, login_user, login_required, logout_user
from flask.ext.login import current_user

app = Flask(__name__)
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
db = SQLAlchemy(app)

login_manager = LoginManager()
login_manager.init_app(app)

######################################################################
# Models
######################################################################
class User(db.Model):
    email = db.Column(db.String(80), primary_key=True, unique=True)
    password = db.Column(db.String(80))
    is_admin = db.Column(db.Boolean, default=False)

    def __init__(self, email, password, is_admin):
        self.email = email
        self.password = password
        self.is_admin = is_admin

    def is_authenticated(self):
        return True

    def is_active(self):
        return True

    def is_anonymous(self):
        return False

    def get_id(self):
        return str(self.email)

    def is_admin(self):
        if self.is_admin:
            return True
        else:
            return False

    def __repr__(self):
        return '<User %r>' % self.email

######################################################################
@login_manager.user_loader
def load_user(email):
    return User.query.filter_by(email = email).first()

@app.before_request
def before_request():
    g.user = current_user

######################################################################
# Routes
######################################################################
@app.route('/')
def index():
    return "Welcome to Flask"

@app.route('/signup', methods=['GET', 'POST'])
def signup():
    form = SignupForm()
    if request.method == 'GET':
        return render_template('signup.html', form = form)
    elif request.method == 'POST':
        if form.validate_on_submit():
            if User.query.filter_by(email=form.email.data).first():
                return "Email address already exists"
            else:
                newuser = User(form.email.data, form.password.data, form.is_admin.data)
                db.session.add(newuser)
                db.session.commit()
                return "User created"
        else:
            #return "Form didn't validate"
            return render_template('signup.html', form=form)

@app.route('/login', methods=['GET','POST'])
def login():
    form = LoginForm()
    if request.method == 'GET':
        return render_template('login.html', form=form)
    elif request.method == 'POST':
        if form.validate_on_submit():
            user=User.query.filter_by(email=form.email.data).first()
            if user:
                if user.password == form.password.data:
                    login_user(user)
                    #return "User logged in"
                    if user.is_admin():
                        return "user is admin"
                    else:
                        return "user is not admin"
                else:
                    return "Wrong password"
            else:
                return "user doesn't exist"
    else:
        return "form not validated"

@app.route("/logout")
@login_required
def logout():
    logout_user()
    return "Logged out"

@app.route('/protected')
@login_required
def protected():
    return "protected area, user: " + current_user.email + ", " + str(g.user.is_admin)
######################################################################

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80, debug=True)

forms.朋友

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, validators, BooleanField
from wtforms.validators import Email, DataRequired


class SignupForm(FlaskForm):
    email = StringField('Email',
                [DataRequired(),Email()])
    password = PasswordField(
                'Password',
                [DataRequired()])
    is_admin = BooleanField('Is an Admin')
    submit = SubmitField("Sign In")


class LoginForm(FlaskForm):
    email = StringField('Email',
                [DataRequired(),Email()])
    password = PasswordField(
                'Password',
                [DataRequired()])
    submit = SubmitField("Sign In")

模板/ signup.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Access</title>
</head>
<body>
    <h1>Sign-up</h1>
    <form method="POST" action="/signup">
        {{ form.hidden_tag() }}
        {{ form.email.label }} {{ form.email(size=20) }}<br>
        {{ form.password.label }} {{ form.password(size=20) }}<br>
        {{ form.is_admin.label }} {{ form.is_admin() }}<br>

        <input type="submit" value="Signup">
    </form>

<h1>Form Errors</h1>
{{ form.errors }}
</body>
</html>

模板/ login.html的

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
    <h1>Login</h1>
    <form method="POST" action="/login">
        {{ form.hidden_tag() }}
        {{ form.email.label }} {{ form.email(size=20) }}
        {{ form.password.label }} {{ form.password(size=20) }}
        <input type="submit" value="login">
    </form>
</body>
</html>
flask flask-sqlalchemy
1个回答
2
投票

问题来自于你在模型类中有一个列is_admin和一个名为is_admin()的函数。在Python中,如果要对类变量和类方法使用相同的名称,请使用you better know what you are doing(但不要)。

为了避免这种情况,你可以将你的函数qazxsw poi重命名为qazxsw poi。

但是如果你考虑一下,直接在视图函数中评估字段,而不必声明一个类方法会更容易:

is_admin()

我还建议您查看is_administrator(),以便更好地了解您在模型中使用所有类方法所做的工作。

© www.soinside.com 2019 - 2024. All rights reserved.