Jon*_*elt 2 html python flask flask-wtforms
我一直在创建一个基于论坛的学习系统,类似于评估项目的堆栈溢出。我对烧瓶相当陌生,但是我相信我对 python 有很好的了解。我一直在关注Corey Schafer 的Flask 教程并将它们调整到我的项目中。每当我尝试访问名为“adduser”的页面(一个带有用于添加用户的表单的网页)时,我都会收到错误消息:
"TypeError: hidden_tag() missing 1 required positional argument: 'self'".
我不知道这意味着什么,也不知道如何尝试修复它。我假设我可能会在“adduser”页面的 HTML 中找到修复程序,在删除'{{ form.hidden_tag() }}'
标记后,我得到了一个不同的错误,这让我相信该错误与'forms.py'
文件和'addUser.html'
文件有关。
表格.py
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, BooleanField
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError
from itroom.models import User
class LoginForm(FlaskForm):
email = StringField('Email',validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
remember = BooleanField('Remember Me')
submit = SubmitField('Login')
class AddUserForm(FlaskForm):
email = StringField('Email',validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
submit = SubmitField('Add User')
def validate_email(self,email):
user = User.query.filter_by(userEmail=email.data).first()
if user:
raise ValidationError('Email already exists in database.')
Run Code Online (Sandbox Code Playgroud)
添加用户.html
{% extends "template.html" %}
{% block content %}
<div class="center2" style="border-color: white;">
<h2 align="center" style="padding: 2.5%;"></h2>
<h1>Add a User</h1>
<form method="POST" action="">
{{ form.hidden_tag() }}
<div class="form-group">
{{form.email.label}}
{% if form.email.errors %}
{{form.email(size=30, class="form-control is-invalid")}}
<div class="invalid-feedback">
{% for error in form.email.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{form.email(size=30, class="form-control")}}
{% endif %}
</div>
{{form.password.label}} <br>
{{form.password(size=30)}}
{{form.submit(class="btn btn-outline-info")}} <br>
</form>
</div>
{% endblock content %}
Run Code Online (Sandbox Code Playgroud)
我还认为路由文件也可能有帮助。
路线.py
from flask import Flask, render_template, url_for, flash, redirect
from itroom import app, db, bcrypt
from itroom.forms import LoginForm, AddUserForm
from itroom.models import User, Post
from flask_login import login_user
@app.route("/")
@app.route("/home") #defines the HTML loaded for /home
def home():
return render_template('home.html', title='Home')
@app.route("/login", methods=['GET', 'POST']) #defines the HTML loaded for /login
def login():
form = LoginForm('')
if form.validate_on_submit():
user = User.query.filter_by(email=form.userEmail.data).first()
if user and bcrypt.check_password_hash(user.userPassword, form.password):
login_user(user, remember=form.remember.data)
return redirect(url_for('home'))
else:
flash('Login Unsucessful, Please check email and password')
return render_template('login.html',form=form, title='Login')
@app.route("/adduser", methods=['GET', 'POST']) #defines the HTML loaded for /adduser
def addUser():
form = AddUserForm('/login')
if form.validate_on_submit():
hashed_password = bcrypt.generate_password_hash(form.password.data).decode ('utf-8')
user = User(userEmail=form.email.data, userPassword = hashed_password)
db.session.add(user)
db.session.commit()
temptext = ("Account created for '", form.email.data, "'." )
flash(temptext)
else:
flash('Account not created')
return render_template('addUser.html', title='Admin', form=AddUserForm)
Run Code Online (Sandbox Code Playgroud)
预先感谢任何试图提供帮助的人!
小智 5
TypeError 是说 self 没有传递给 hidden_tag 方法。如果您不小心执行以下操作,可能会出现此错误:
class A:
def test(self):
print('test')
A.test() # TypeError: test() missing 1 required positional argument: 'self'
A().test() # prints test
Run Code Online (Sandbox Code Playgroud)
所以这意味着您正在使用类对象调用该方法。
在您的路由中,您有以下规则,您将一个类传递到您的页面,但您可能希望返回您的实际表单对象。所以你必须改变
return render_template('addUser.html', title='Admin', form=AddUserForm)
Run Code Online (Sandbox Code Playgroud)
到
form = AddUserForm('/login')
...
return render_template('addUser.html', title='Admin', form=form)
Run Code Online (Sandbox Code Playgroud)
小智 5
您忘记在最后一个返回语句末尾调用该表单。
当前代码
else:
flash('Account not created')
return render_template('addUser.html', title='Admin', form=AddUserForm)
Run Code Online (Sandbox Code Playgroud)
固定代码
else:
flash('Account not created')
return render_template('addUser.html', title='Admin', form=AddUserForm())
Run Code Online (Sandbox Code Playgroud)
或者因为您已经指定了
form = AddUserForm('/login')
Run Code Online (Sandbox Code Playgroud)
只需在最后指定它,就像在其他路线中所做的那样
return render_template('addUser.html', title='Admin', form=form)
Run Code Online (Sandbox Code Playgroud)