Giriş


Bu bölümde sahte blog gönderileri kaldırılarak gerçek gönderiler ekleme desteği kazandırılacak, tüm kullanıcıların gönderilerini gösteren bir "Explore" sayfası oluşturulacak ve uzun listelerin yönetimi için sayfalama (pagination) özelliği uygulanacak.


Blog Gönderisi Ekleme

app/forms.py — Post Formu Ekle

class PostForm(FlaskForm):
    post = TextAreaField('Say something', validators=[
        DataRequired(), Length(min=1, max=140)])
    submit = SubmitField('Submit')

app/templates/index.html — Gönderi Formunu Ekle

{% extends "base.html" %}

{% 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 %}
        {% include '_post.html' %}
    {% endfor %}
{% endblock %}

app/routes.py — Index View Fonksiyonunu Güncelle

from app.forms import PostForm
from app.models import Post

@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
@login_required
def index():
    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'))
    posts = db.session.scalars(current_user.following_posts()).all()
    return render_template("index.html", title='Home Page', form=form,
                           posts=posts)

Post/Redirect/Get Deseni: Form gönderimi sonrası redirect() kullanılması standart bir pratiktir. Böylece kullanıcı sayfayı yenilediğinde form tekrar gönderilmez.


Explore Sayfası

app/routes.py — Explore View Fonksiyonu Ekle

@app.route('/explore')
@login_required
def explore():
    query = sa.select(Post).order_by(Post.timestamp.desc())
    posts = db.session.scalars(query).all()
    return render_template('index.html', title='Explore', posts=posts)