AttributeError: у объекта 'function' нет атрибута '_sa_instance_state' - PullRequest
1 голос
/ 21 марта 2020

Я создаю функцию публикации блога для сайта в социальных сетях. Однако, когда я нажал кнопку «Опубликовать», чтобы опубликовать блог, веб-сайт не перенаправил меня к шаблону, который я вставил, при отображении ошибки в моем терминале: «Объект AttributeError:« функция »не имеет атрибута« _sa_instance_state ».

Глядя на трассировку, я обнаружил, что есть какая-то связь с моими отношениями, которые я установил между моделями User и BlogPost.

Вот код для моих моделей (или models.py):

from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin
from datetime import datetime

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(user_id)




class User(db.Model, UserMixin):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    profile_image = db.Column(db.String(64), nullable=False, default='default_profile.jpg' ) 
    email = db.Column(db.String(64), unique=True, index=True) 
    first_name = db.Column(db.String(20))
    last_name = db.Column(db.String(20))
    username = first_name + last_name
    password_hash = db.Column(db.String(128))

    posts = db.relationship('BlogPost', backref='creator', lazy=True) 

    def __init__(self,email,first_name,last_name, password):    
        self.email = email
        self.first_name = first_name
        self.last_name = last_name
        self.password_hash = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.password_hash, password)

    def __repr__(self):
        return f"Username: {self.username}"



class BlogPost(db.Model):

    users = db.relationship(User)

    blog_id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer,db.ForeignKey('users.id'), nullable=False) #users.id  is taken from the tablename(users) and id in its table
    date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) 
    problem_name = db.Column(db.String(140), nullable=False)
    text = db.Column(db.Text, nullable=False)

    def __init__(self, text, problem_name, user_id):
        self.text = text
        self.problem_name = problem_name
        self.user_id = user_id

    def __repr__(self):
        return f"Post ID: {self.post_id} -- Date:{self.date}---{self.problem_name}" ```

Вот код моих просмотров (или views.py) блога для публикации:

blog_posts = Blueprint('blog_posts',__name__)

@blog_posts.route('/create', methods=['GET', 'POST'])
@login_required
def create_post():
    form = BlogPostForm()

    if form.validate_on_submit():

        blog_validated = BlogPost(problem_name=form.problem_name.data,
                                  text=form.text.data,
                                  user_id=current_user.id
                                  )
        db.session.add(blog_validated)
        db.session.commit()
        flash('Blog Post Created')
        return redirect(url_for('core.index'))

    return render_template('create_post.html', form=form)

А вот код для шаблона create_post. html:

{% extends "base.html" %}

{% block content %}
<div class="container">
<form method="POST" >
    {{ form.hidden_tag() }}
    {{ form.problem_name.label(class="form-control-label") }} {{ form.problem_name(class="form-group form-control") }}<br>
    {{ form.text.label }} {{ form.text(class="form-group form-control") }}<br>
    {{ form.problem_submit.label(class="btn btn-secondary")}}
</form>
</div>
{% endblock %}

Ниже приведен мой полный трекбэк: enter image description here Traceback.imagem.no1

1 : П / с. Все представления, шаблоны и коды работают хорошо, используя модель User. Я студент и создаю проект. Мой учитель информатики не может помочь мне, поэтому я действительно застрял. Пожалуйста, пожалуйста, помогите. Спасибо!

Ответы [ 2 ]

1 голос
/ 21 марта 2020

В строке 93 в user_post необходимо поместить скобки в конец строки, определяющей home_user.

@users.route('/<username>')
def user_posts(username):
     page = request.args.get('page',1,type=int)
     home_user = User.query.filter_by(username=username).first_or_404() # <= You're missing the ()
     blog_posts = BlogPost.query.filter_by(creator=home_user).order_by(BlogPost.date.desc()).paginate(page=page, per_page=5) return render_template('user_blog_posts.html', blog_posts=blog_posts, home_user=home_user)
0 голосов
/ 21 марта 2020

РЕДАКТИРОВАТЬ: Это плохой ответ, но мне любопытно, будет ли он работать

: O

В строке 94 в user_post вам нужно позвонить homeuser ... filter_by(creator=homeuser()) вместо filter_by(creator=homeuser)

...