#python #flask #nonetype
#python #flask #нетипичный
Вопрос:
Приведенный ниже код находится в моем проекте:
flaskblog/
/users
/forms.py
class UpdateAccountForm(FlaskForm):
## ERROR ##
'NoneType' object has no attribute 'username'
но у него должен быть current_user:
User('test1', 'test1@test.com', 'fdd6f1e03J3fc6a4.jpg')
содержимое ошибки:
Traceback (most recent call last):
File "run.py", line 1, in <module>
from flaskblog import app
File "/home/ali/flask/flask_project2/Flask_Blog/flaskblog/__init__.py", line 20, in <module>
from flaskblog import routes # here because preventional of circular import.
File "/home/ali/flask/flask_project2/Flask_Blog/flaskblog/routes.py", line 3, in <module>
from flaskblog.forms import RegistrationForm, LoginForm, UpdateAccountForm
File "/home/ali/flask/flask_project2/Flask_Blog/flaskblog/forms.py", line 40, in <module>
class UpdateAccountForm(FlaskForm):
File "/home/ali/flask/flask_project2/Flask_Blog/flaskblog/forms.py", line 43, in UpdateAccountForm
render_kw={"value":current_user.username.data})
File "/home/ali/flask/flask_project2/venv/lib/python3.8/site-packages/werkzeug/local.py", line 347, in __getattr__
return getattr(self._get_current_object(), name)
AttributeError: 'NoneType' object has no attribute 'username'
USERS/forms.py
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed
from wtforms import StringField, PasswordField, SubmitField, BooleanField
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError, Optional
from flaskblog.models import User
from flask_login import current_user
class UpdateAccountForm(FlaskForm):
username = StringField('Username',
validators=[DataRequired(), Length(min=2, max=20)],
render_kw={"value":current_user.username.data})
submit = SubmitField('Update')
def validate_username(self, username):
if username.data != current_user.username:
user = User.query.filter_by(username=username.data).first()
if user:
raise ValidationError('That username is taken. Please choose a different one.')
def validate_email(self, email):
if email.data != current_user.email:
user = User.query.filter_by(email=email.data).first()
if user:
raise ValidationError('That email is taken. Please choose a different one.')
FLASKBLOG/models.py
# models.py
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
image_file = db.Column(db.String(20), nullable=False, default='default.png')
password = db.Column(db.String(60), nullable=False) # we will hash passwords
posts = db.relationship('Post', backref='author', lazy=True) # upper case because it hints to a "class"
def get_reset_token(self, expires_sec=1800):
s = Serializer(current_app.secret_key, expires_sec)
# s = Serializer(app.config['SECRET_KEY'])
return s.dumps({'user_id' : self.id}).decode('utf-8') # generats token
извините, если у меня были ошибки в английском 🙂
Комментарии:
1. Ну, похоже, что current_user == Нет. Так, может быть, покажете нам, что происходит в flask_login?
2. Во-первых, как гласит ошибка explcity: объект ‘NoneType’ не имеет атрибута, означает, что в ‘current_user’ нет никакого ‘user’, потому что на самом деле его нет. Итак, я думаю, что настоящая ошибка не в вашем файле с именем ‘forms.py ‘ но скорее где-то в другом месте (если ‘current_user.username.data’ не является правильным) Вам нужно добавить больше кода, чтобы понять, почему «текущий пользователь» — это none. .
3. если я укажу на
"value":current_user
, это сработает, он напечатает этот пользовательский объект, но если я укажу «value»:str(current_user), он перезапустит NoneType4. извините, Бастьен Харкинс, я не могу понять, какую часть моего кода вы хотите
5. Я добавил свою ссылку на github