I have two models: 1) User model

class User(db.Model): id = db.Column(db.Integer, primary_key=True) nickname = db.Column(db.String(100), index=True, unique=True) email = db.Column(db.String(120), index=True, unique=True) password = db.Column(db.String(100), index=True, unique=True) role = db.Column(db.SmallInteger, default=ROLE_USER) posts = db.relationship('Entry', backref='author', lazy='dynamic') about_me = db.Column(db.String(140)) last_seen = db.Column(db.DateTime) pwdhash = db.Column(db.String(100)) 

2) Record model:

 сlass Entry(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(80)) text = db.Column(db.Text) pub_date = db.Column(db.DateTime) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) 

There is also a user view:

 @app.route('/user/<nickname>', methods=['GET', 'POST']) @login_required def user(nickname): title = 'Ваша страница' user = User.query.filter_by(nickname=nickname).first_or_404() if user == None: flash('Пользователь ' + nickname + ' не найден.') return redirect(url_for('index')) post = user.posts.order_by(Entry.pub_date.desc()).all() return render_template('user.html', title=title, user=user, post=post) 

And the add entry view:

 @app.route('/add', methods=['GET', 'POST']) @login_required def add(): title = 'Добавление стиха' form = EntryForm() if form.validate_on_submit(): add_entry = Entry(form.title.data, form.text.data, form.pub_date.data) db.session.add(add_entry) db.session.commit() flash('Вы добавили новый стих') return redirect(url_for('user', nickname=g.user.nickname)) return render_template('entry.html', title=title, form=form) 

user template:

 {% for post in posts %} <p>{{ entry.title }}</p> <pre>{{ entry.text }}</pre> <p>{{ entry.pub_date }}</p> {% endfor %} 

Add record template:

 {% block content %} <form class=login-form method=post action=add> <h1 align=center>Заполните поля, для регистрации вашего стиха:</h1> <p> {{ form.hidden_tag() }} <div class=field> <p>{{ form.title.label }}:</p> <p>{{ form.title(size=25) }}</p> {% for error in form.errors.title %} <br><span style="color: red;">[{{ error }}]</span> {% endfor %} <div class=field> <p>{{ form.text.label }}:</p> <p>{{ form.text(cols=35, rows=20) }} </p> {% for error in form.errors.text %} <br><span style="color: red;">[{{ error }}]</span> {% endfor %} </div> <div class=field> <p>{{ form.pub_date.label }}:</p> <p>{{ form.pub_date(size=20) }}</p> <input type="submit" value="Разместить стих"> </div> </form> {% endblock %} 

So the question is, how do I get a list of records? How to bind records to a user through a view?

  • Does that user have any posts at all? The code seems to be true (although I would rename post -> posts , or else it confuses) - gil9red
  • gil9red - Yes there is. Moreover, this entry is displayed on the main page, but does not want to appear on the user's page (And renaming the variable post gave nothing) - Sergey Alekseev

2 answers 2

It is necessary to add an entry to the parent table, this can be done somehow (I use ORM Alchemy a little differently):

 @app.route('/add/<nickname>', methods=['GET', 'POST']) @login_required def add(nickname): title = 'Добавление стиха' form = EntryForm() if form.validate_on_submit(): user = User.query.filter_by(nickname=nickname).first() if not user: flash('Пользователь ' + nickname + ' не найден.') return redirect(url_for('index')) add_entry = Entry(form.title.data, form.text.data, form.pub_date.data) user.posts.append(add_entry) db.session.add(add_entry) db.session.commit() flash('Вы добавили новый стих') return redirect(url_for('user', nickname=g.user.nickname)) return render_template('entry.html', title=title, form=form) 

http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#association-object

  • one
    Entry is a model. Renamed post to entry, nothing has changed. - Sergey Alekseev
  • one
    Change the line in your return render_template('user.html', title=title, user=user, posts=post) , as I understand it. You have already changed the template and it looks like this: {% for entry in posts %} - Igor Lavrynenko
  • one
    entry = user.posts.order_by (Entry.pub_date.desc ()). all (), return render_template ('user.html', title = title, user = user, entry = entry), {% for entry per entry% } <p> {{entry.title}} </ p> <pre> {{entry.text}} </ pre> <p> {{entry.pub_date}} </ p> {% endfor%} like this Here - Sergey Alekseev
  • one
    View: ...... post = user.posts.order_by(Entry.pub_date.desc()).all() return render_template('user.html', title=title, user=user, posts=post) Template : {% for entry in posts %} <p>{{ entry.title }}</p> <pre>{{ entry.text }}</pre> <p>{{ entry.pub_date }}</p> {% endfor %} - Igor Lavrynenko
  • Then debug or just print([i.title for i in entry]) call a function before return - see what's in your entry - Igor Lavrynenko

So it will be more logical:

 @app.route('/user/<nickname>', methods=['GET', 'POST']) @login_required def user(nickname): title = 'Ваша страница' user = User.query.filter_by(nickname=nickname).first_or_404() if user == None: flash('Пользователь ' + nickname + ' не найден.') return redirect(url_for('index')) posts = user.posts.order_by(Entry.pub_date.desc()).all() return render_template('user.html', title=title, user=user, posts=posts) {% for post in posts %} <p>{{ post.title }}</p> <pre>{{ post.text }}</pre> <p>{{ post.pub_date }}</p> {% endfor %} 

To work as you have now, replace in the template:

{% for post in posts %} to {% for entry in post %}

  • I understood what was going on. When adding a record, the user id is not assigned. Here is the entry for adding an entry: .................. @ app.route ('/ add', methods = ['GET', 'POST']) @login_required def add ( ): title = 'Add a verse' form = EntryForm () if form.validate_on_submit (): add_entry = Entry (form.title.data, form.text.data, form.pub_date.data) db.session.add (add_entry) db.session.commit () flash ('You added a new verse') return redirect (url_for ('user', nickname = g.user.nickname)) return render_template ('entry.html', title = title, form = form ) - Sergey Alekseev