使用Flask实现帖子的建模

本文介绍了如何使用Flask框架来实现帖子的建模,包括post模型的创建、关联表collections的添加、post表单的设计以及数据库迁移和视图函数的更新。

Flask实现的功能:

  • post模型的建立
  • post表单的建立

post模型的建立:

from app.extensions import db
from datetime import datetime


class Posts(db.Model):
    __tablename__ = 'posts'
    id = db.Column(db.Integer, primary_key=True)
    rid = db.Column(db.Integer, default=0)
    content = db.Column(db.Text)
    timestamp = db.Column(db.DateTime, default=datetime.utcnow)
    # 添加外键关联,'表名.字段'
    uid = db.Column(db.Integer, db.ForeignKey('users.id'))

__init__.py:
添加关联表collections

from app.extensions import db
from .user import User
from .posts import Posts


# 用户收藏帖子的中间关联表,不需手动维护
collections = db.Table('collections',
    db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
    db.Column('posts_id', db.Integer, db.ForeignKey('posts.id'))
)

post表单的建立:

from flask_wtf import FlaskForm
from wtforms import TextAreaField, SubmitField
from wtforms.validators import Length


# 发表博客表单
class PostsForm(FlaskForm):
    # render_kw:渲染的字段的属性字典
    content = TextAreaField('', render_kw={'placeholder': '这一刻的想法...'}, validators=[Length(3, 140, message='只能在3~140个字符之间')])
    submit = SubmitField('发表')

__init__.py:

from .user import RegisterForm, LoginForm, IconForm
from .posts import PostsForm

user模型的更新:

class User(UserMixin, db.Model):
....
    posts = db.relationship('Posts',backref='user', lazy='dynamic')

数据库迁移,更新:

python manage.py db migrate
python manage.py db upgrade

main视图函数的更新:

from flask import Blueprint,render_template,redirect,url_for,flash

from app.forms import PostsForm
from flask_login import current_user
from app.models import Posts
from app.extensions import db

main = Blueprint('main', __name__)

@main.route('/', methods=['GET', 'POST'])
def index():
    form = PostsForm()
    if form.validate_on_submit():
        if current_user.is_authenticated:
            u = current_user._get_current_object()
            p = Posts(content=form.content.data,user=u)
            db.session.add(p)
            flash('post success')
            return redirect(url_for('main.index'))
        else:
            flash('please login')
            return redirect(url_for('user.login'))
    posts = Posts.query.filter_by(rid=0).order_by(Posts.timestamp.desc())
    return render_template('main/index.html',form=form,posts=posts)

main/index.html更新:

{% extends 'common/base.html' %}


{% block title %}首页{% endblock %}

{% block page_content %} 
        {% if current_user.is_authenticated %} 
        <h1>hello! {{current_user.username}}</h1>
        {{ quick_form(form) }}
        {% endif %}  
        {% for p in posts %}
        <div class="media">
            <div class="media-left">
                <a href="#">
                    <img class="media-object" src="{{ url_for('static', filename='upload/'+p.user.icon) }}" alt="icon">
                </a>
            </div>
            <div class="media-body">
                <div style="float: right">发表于:{{ moment(p.timestamp).fromNow() }}</div>
                <h4 class="media-heading">{{ p.user.username }}</h4>
                {{ p.content }} 
                {% endfor %}    

{% endblock %}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值