Chapter 9: Pagination (v0.9)
This commit is contained in:
		
							parent
							
								
									b5778cd75b
								
							
						
					
					
						commit
						89ae809e08
					
				| 
						 | 
				
			
			@ -46,3 +46,8 @@ class EditProfileForm(FlaskForm):
 | 
			
		|||
            user = User.query.filter_by(username=self.username.data).first()
 | 
			
		||||
            if user is not None:
 | 
			
		||||
                raise ValidationError('Please use a different username.')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PostForm(FlaskForm):
 | 
			
		||||
    post = TextAreaField('Say something', validators=[DataRequired()])
 | 
			
		||||
    submit = SubmitField('Submit')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,8 +3,8 @@ from flask import render_template, flash, redirect, url_for, request
 | 
			
		|||
from flask_login import login_user, logout_user, current_user, login_required
 | 
			
		||||
from werkzeug.urls import url_parse
 | 
			
		||||
from app import app, db
 | 
			
		||||
from app.forms import LoginForm, RegistrationForm, EditProfileForm
 | 
			
		||||
from app.models import User
 | 
			
		||||
from app.forms import LoginForm, RegistrationForm, EditProfileForm, PostForm
 | 
			
		||||
from app.models import User, Post
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.before_request
 | 
			
		||||
| 
						 | 
				
			
			@ -14,21 +14,41 @@ def before_request():
 | 
			
		|||
        db.session.commit()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.route('/')
 | 
			
		||||
@app.route('/index')
 | 
			
		||||
@app.route('/', methods=['GET', 'POST'])
 | 
			
		||||
@app.route('/index', methods=['GET', 'POST'])
 | 
			
		||||
@login_required
 | 
			
		||||
def index():
 | 
			
		||||
    posts = [
 | 
			
		||||
        {
 | 
			
		||||
            'author': {'username': 'John'},
 | 
			
		||||
            'body': 'Beautiful day in Portland!'
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            'author': {'username': 'Susan'},
 | 
			
		||||
            'body': 'The Avengers movie was so cool!'
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
    return render_template('index.html', title='Home', posts=posts)
 | 
			
		||||
    form = PostForm()
 | 
			
		||||
    if form.validate_on_submit():
 | 
			
		||||
        post = Post(body=form.post.data, author=current_user)
 | 
			
		||||
        db.session.add(post)
 | 
			
		||||
        db.session.commit()
 | 
			
		||||
        flash('Your post is now live!')
 | 
			
		||||
        return redirect(url_for('index'))
 | 
			
		||||
    page = request.args.get('page', 1, type=int)
 | 
			
		||||
    posts = current_user.followed_posts().paginate(
 | 
			
		||||
        page, app.config['POSTS_PER_PAGE'], False)
 | 
			
		||||
    next_url = url_for('index', page=posts.next_num) \
 | 
			
		||||
        if posts.has_next else None
 | 
			
		||||
    prev_url = url_for('index', page=posts.prev_num) \
 | 
			
		||||
        if posts.has_prev else None
 | 
			
		||||
    return render_template('index.html', title='Home', form=form,
 | 
			
		||||
                           posts=posts.items, next_url=next_url,
 | 
			
		||||
                           prev_url=prev_url)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.route('/explore')
 | 
			
		||||
@login_required
 | 
			
		||||
def explore():
 | 
			
		||||
    page = request.args.get('page', 1, type=int)
 | 
			
		||||
    posts = Post.query.order_by(Post.timestamp.desc()).paginate(
 | 
			
		||||
        page, app.config['POSTS_PER_PAGE'], False)
 | 
			
		||||
    next_url = url_for('explore', page=posts.next_num) \
 | 
			
		||||
        if posts.has_next else None
 | 
			
		||||
    prev_url = url_for('explore', page=posts.prev_num) \
 | 
			
		||||
        if posts.has_prev else None
 | 
			
		||||
    return render_template('index.html', title='Explore', posts=posts.items,
 | 
			
		||||
                           next_url=next_url, prev_url=prev_url)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.route('/login', methods=['GET', 'POST'])
 | 
			
		||||
| 
						 | 
				
			
			@ -74,11 +94,15 @@ def register():
 | 
			
		|||
@login_required
 | 
			
		||||
def user(username):
 | 
			
		||||
    user = User.query.filter_by(username=username).first_or_404()
 | 
			
		||||
    posts = [
 | 
			
		||||
        {'author': user, 'body': 'Test post #1'},
 | 
			
		||||
        {'author': user, 'body': 'Test post #2'}
 | 
			
		||||
    ]
 | 
			
		||||
    return render_template('user.html', user=user, posts=posts)
 | 
			
		||||
    page = request.args.get('page', 1, type=int)
 | 
			
		||||
    posts = user.posts.order_by(Post.timestamp.desc()).paginate(
 | 
			
		||||
        page, app.config['POSTS_PER_PAGE'], False)
 | 
			
		||||
    next_url = url_for('user', username=user.username, page=posts.next_num) \
 | 
			
		||||
        if posts.has_next else None
 | 
			
		||||
    prev_url = url_for('user', username=user.username, page=posts.prev_num) \
 | 
			
		||||
        if posts.has_prev else None
 | 
			
		||||
    return render_template('user.html', user=user, posts=posts.items,
 | 
			
		||||
                           next_url=next_url, prev_url=prev_url)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.route('/edit_profile', methods=['GET', 'POST'])
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
    <table>
 | 
			
		||||
        <tr valign="top">
 | 
			
		||||
            <td><img src="{{ post.author.avatar(36) }}"></td>
 | 
			
		||||
            <td>{{ post.author.username }} says:<br>{{ post.body }}</td>
 | 
			
		||||
            <td><a href="{{ url_for('user', username=post.author.username) }}">{{ post.author.username }}</a> says:<br>{{ post.body }}</td>
 | 
			
		||||
        </tr>
 | 
			
		||||
    </table>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,6 +10,7 @@
 | 
			
		|||
        <div>
 | 
			
		||||
            Microblog:
 | 
			
		||||
            <a href="{{ url_for('index') }}">Home</a>
 | 
			
		||||
            <a href="{{ url_for('explore') }}">Explore</a>
 | 
			
		||||
            {% if current_user.is_anonymous %}
 | 
			
		||||
            <a href="{{ url_for('login') }}">Login</a>
 | 
			
		||||
            {% else %}
 | 
			
		||||
| 
						 | 
				
			
			@ -28,5 +29,5 @@
 | 
			
		|||
        {% endif %}
 | 
			
		||||
        {% endwith %}
 | 
			
		||||
        {% block content %}{% endblock %}
 | 
			
		||||
    </body>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,26 @@
 | 
			
		|||
 | 
			
		||||
{% block content %}
 | 
			
		||||
    <h1>Hi, {{ current_user.username }}!</h1>
 | 
			
		||||
    {% if form %}
 | 
			
		||||
    <form action="" method="post">
 | 
			
		||||
        {{ form.hidden_tag() }}
 | 
			
		||||
        <p>
 | 
			
		||||
            {{ form.post.label }}<br>
 | 
			
		||||
            {{ form.post(cols=32, rows=4) }}<br>
 | 
			
		||||
            {% for error in form.post.errors %}
 | 
			
		||||
            <span style="color: red;">[{{ error }}]</span>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </p>
 | 
			
		||||
        <p>{{ form.submit() }}</p>
 | 
			
		||||
    </form>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
    {% for post in posts %}
 | 
			
		||||
    <div><p>{{ post.author.username }} says: <b>{{ post.body }}</b></p></div>
 | 
			
		||||
        {% include '_post.html' %}
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
    {% if prev_url %}
 | 
			
		||||
    <a href="{{ prev_url }}">Newer posts</a>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
    {% if next_url %}
 | 
			
		||||
    <a href="{{ next_url }}">Older posts</a>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,4 +23,10 @@
 | 
			
		|||
    {% for post in posts %}
 | 
			
		||||
        {% include '_post.html' %}
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
    {% if prev_url %}
 | 
			
		||||
    <a href="{{ prev_url }}">Newer posts</a>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
    {% if next_url %}
 | 
			
		||||
    <a href="{{ next_url }}">Older posts</a>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue