Flask项目实战:创建电影网站(3)后台的增删改查

时间:2022-02-09 12:37:00

Flask项目实战:创建电影网站(3)后台的增删改查

添加预告

根据需求数据库创建表格

需求数据库,关键字title logo

# 上映预告
class Preview(db.Model):
    __tablename__ = "preview"
    __table_args__ = {"useexisting": True}
    id = db.Column(db.Integer, primary_key=True)  # 编号
    title = db.Column(db.String(255), unique=True)  # 标题
    logo = db.Column(db.String(255), unique=True)  # 封面
    addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow)  # 添加时间

    def __repr__(self):
        return "<Preview %r>" % self.title

forms.py 中创建表格字段, title logo submit

class PreviewForm(FlaskForm):
    title = StringField(
        label='片名',
        validators=[  # 验证器
            DataRequired("请输入预告片名")
        ],
        description="片名",
        render_kw={
            "class ": "form-control",
            "placeholder": "请输入预告片名!",
        }
    )
    logo = FileField(
        label='预告封面',
        validators=[  # 验证器
            DataRequired("请上传文件!")
        ],
        description="预告封面",
    )
    submit = SubmitField(
        "提交",
        render_kw={
            "class ": "btn btn-primary"
        }
    )

字段类型

根据字面意思就能理解:StringField FileField TextAreaField SelectField SubmitField,分别对应字符串 文件 文本块 下拉框 提交按钮
***

修改html

将'PreviewForm'对应的字段在preview_add.html中添加:

<form role="form" method="POST" enctype="multipart/form-data">
                    <div class="box-body">
                        <div class="form-group">
                            <label for="input_title">{{form.title.label}}</label>
                            {{form.title}}
                            {% for err in form.title.errors%}
                            <div class="col-md-12" style="color:#ff0000">{{err}}</div>
                            {%endfor%}
                        </div>
                        <div class="form-group">
                            <label for="input_logo">{{form.logo.label}}</label>
                            {{form.logo}}
                            {% for err in form.logo.errors%}
                            <div class="col-md-12" style="color:#ff0000">{{err}}</div>
                            {%endfor%}
                            <img data-src="holder.js/262x166" style="margin-top:5px;" class="img-responsive"
 alt="">
                        </div>
                    </div>
                    <div class="box-footer">
                        {{form.submit}}
                        {{form.csrf_token}}
                    </div>
                </form>

views.py 中处理逻辑

代码展示:

#预告管理
@admin.route('/preview_add/',methods=["GET","POST"])
@admin_login_req
def preview_add():
    form = PreviewForm();
    if form.validate_on_submit():
        data = form.data
        file_logo = secure_filename(form.logo.data.filename)
        if not os.path.exists(app.config["UP_DIR"]):
            # 创建一个多级目录
            os.makedirs(app.config["UP_DIR"])
            os.chmod(app.config["UP_DIR"], "rw")
        logo = change_filename(file_logo)
        # 保存
        form.logo.data.save(app.config["UP_DIR"] + logo)
        # url,logo为上传视频,图片之后获取到的地址
        preview = Preview(
            title=data["title"],
            logo=logo,
        )
        db.session.add(preview)
        db.session.commit()
        flash("添加电影预告成功!", "ok")
        return redirect(url_for('admin.preview_add'))
    return render_template('admin/preview_add.html',form=form)

其中 form = PreviewForm();是初始化表格;return render_template('admin/preview_add.html',form=form)是将表格传入到模板文件中;if form.validate_on_submit():是监听提交表单事件;data = form.data是提取表单内容;

列表展示

@admin.route('/preview_list/<int:page>/',methods=["GET"])
@admin_login_req
def preview_list(page=None):
    if page is None:
        page = 1
    page_data = Preview.query.order_by(
        Preview.addtime.desc()
    ).paginate(page,per_page=3)
    return render_template('admin/preview_list.html',page_data = page_data)

列表编辑、数据删除略。