您现在的位置是: 网站首页 >Flask >Flask搭建微电影视频网站 Flask
【Flask微电影】16.电影预告管理:增删查改
admin2018年11月11日 20:13 【Flask | Html | Python 】 1320人已围观
Flask搭建微电影视频网站简介 利用Flask搭建微电影视频网站 Github地址:https://github.com/xyliurui/FlaskMovie
## 预告管理 ### 预告增加 #### 创建预告添加表单 ```python class PreviewForm(FlaskForm): title = StringField( label='预告标题', validators=[ DataRequired('请输入预告标题!') ], description='请输入预告标题!', render_kw={ 'class': "form-control" } ) logo = FileField( label='预告封面', validators=[ DataRequired('请上传预告封面!') ], ) ``` **这儿添加和更新使用同一个模板文件,直接将preview_add.html修改为preview_edit.html** #### 修改preview_add预告增加视图 ```python from app.admin.forms import LoginFrom, TagForm, MovieForm, PreviewForm from app.models import Admin, Tag, Movie, Preview @admin.route("/preview/add/", methods=['GET', 'POST']) @admin_login_require def preview_add(): form = PreviewForm() if form.validate_on_submit(): data = form.data if Preview.query.filter_by(title=data['title']).count() == 1: flash('预告标题已存在,请检查!', category='err') return redirect(url_for('admin.preview_add')) file_logo = secure_filename(form.logo.data.filename) # 获取上传文件名字 file_save_path = app.config['UP_DIR'] # 文件上传保存路径 if not os.path.exists(file_save_path): os.makedirs(file_save_path) # 如果文件保存路径不存在,则创建一个多级目录 import stat os.chmod(file_save_path, stat.S_IRWXU) # 授予可读写权限 logo = change_filename(file_logo) # 文件重命名 form.logo.data.save(file_save_path + 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_edit.html', form=form) ``` #### 增加模板中的消息显示alert_info.html模块 在**app/templates/admin/**目录下创建alert_info.html模板文件 ```html {% with msgs = get_flashed_messages(category_filter=['ok']) %} {% if msgs %} <div class="alert alert-success alert-dismissible"> <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button> <h4><i class="icon fa fa-check"></i> 成功!</h4> {% for msg in msgs %} <p>{{ msg }}</p> {% endfor %} </div> {% endif %} {% endwith %} {% with msgs = get_flashed_messages(category_filter=['err']) %} {% if msgs %} <div class="alert alert-danger alert-dismissible"> <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button> <h4><i class="icon fa fa-ban"></i> 失败!</h4> {% for msg in msgs %} <p>{{ msg }}</p> {% endfor %} </div> {% endif %} {% endwith %} ``` 之后再其他模板中就不用重复编写,直接包含这个模块即可,使用方式:`{% include 'admin/alert_info.html' %}` #### 修改preview_edit.html预告编辑模板 由于添加和更新使用相同的模板,所以需要对访问url进行判断 ```html {% extends 'admin/base.html' %} {% block content %} <section class="content-header"> <h1>微电影管理系统</h1> <ol class="breadcrumb"> <li><a href="#"><i class="fa fa-dashboard"></i> 预告管理</a></li> <li class="active"> {% if request.path == url_for('admin.preview_add') %} 添加预告 {% else %} 修改预告 {% endif %} </li> </ol> </section> <section class="content" id="showcontent"> <div class="row"> <div class="col-md-12"> <div class="box box-primary"> <div class="box-header with-border"> <h3 class="box-title"> {% if request.path == url_for('admin.preview_add') %} 添加预告 {% else %} 修改预告 {% endif %} </h3> </div> <form role="form" method="post" enctype="multipart/form-data"> <div class="box-body"> {% include 'admin/alert_info.html' %} <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: red">{{ 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: red">{{ err }}</div> {% endfor %} {% if request.path != url_for('admin.preview_add') %} <img src="{{ url_for('static', filename="media/"+preview.logo) }}" data-src="holder.js/700x320" style="margin-top:5px;" class="img-responsive" alt=""> {% endif %} </div> </div> {{ form.csrf_token }} <div class="box-footer"> {{ form.submit }} </div> </form> </div> </div> </div> </section> {% endblock %} {% block js %} <script> // 激活菜单栏 $(document).ready(function () { $("#g-4").addClass('active'); $("#g-4-1").addClass('active'); }) </script> {% endblock %} ``` ![BLOG_20181111_201406_53](/media/blog/images/2018/11/BLOG_20181111_201406_53.png "博客图集BLOG_20181111_201406_53.png") ![BLOG_20181111_201500_46](/media/blog/images/2018/11/BLOG_20181111_201500_46.png "博客图集BLOG_20181111_201500_46.png") 假如数据库已存在的,会提示错误 ![BLOG_20181111_201509_11](/media/blog/images/2018/11/BLOG_20181111_201509_11.png "博客图集BLOG_20181111_201509_11.png") ### 预告列表 #### 修改preview_list预告显示视图 ```python @admin.route("/preview/list/<int:page>/") @admin_login_require def preview_list(page=None): page_previews = Preview.query.paginate(page=page, per_page=10) return render_template('admin/preview_list.html', page_previews=page_previews) ``` #### 修改preview_list.html预告显示模板 ```html <div class="box-body table-responsive no-padding"> <table class="table table-hover"> {% include 'admin/alert_info.html' %} <tbody> <tr> <th>编号</th> <th>预告标题</th> <th>预告封面</th> <th>添加时间</th> <th>操作事项</th> </tr> {% for preview in page_previews.items %} <tr> <td>{{ preview.id }}</td> <td>{{ preview.title }}</td> <td> <img src="{{ url_for('static', filename='media/'+preview.logo) }}" style="max-height: 50px" data-src="holder.js/140x64" class="img-responsive center-block" alt=""> </td> <td>{{ preview.add_time }}</td> <td> <a class="label label-success">编辑</a> <a class="label label-danger">删除</a> </td> </tr> {% endfor %} </tbody> </table> </div> <div class="box-footer clearfix"> {% import 'admin/pagination.html' as pg %} {{ pg.render_pagination(page_previews, 'admin.preview_list') }} </div> ``` ![BLOG_20181111_201537_37](/media/blog/images/2018/11/BLOG_20181111_201537_37.png "博客图集BLOG_20181111_201537_37.png") **需要修改base.html预告列表链接**,增加page参数 ```html <a href="{{ url_for('admin.preview_list', page=1) }}"> <i class="fa fa-circle-o"></i> 预告列表 </a> ``` ### 预告删除 #### 增加preview_delete预告删除视图 删除预告会将旧的图片文件删除 ```python @admin.route("/preview/delete/<int:delete_id>/", methods=['GET']) @admin_login_require def preview_delete(delete_id=None): if delete_id: preview = Preview.query.filter_by(id=delete_id).first_or_404() # 删除同时要从磁盘中删除封面文件 file_save_path = app.config['UP_DIR'] # 文件上传保存路径 # 如果存在将进行删除,不判断,如果文件不存在删除会报错 if os.path.exists(os.path.join(file_save_path, preview.logo)): os.remove(os.path.join(file_save_path, preview.logo)) # 删除数据库,提交修改,注意后面要把与电影有关的评论都要删除 db.session.delete(preview) db.session.commit() # 删除后闪现消息 flash('删除预告成功!', category='ok') return redirect(url_for('admin.preview_list', page=1)) ``` #### 修改preview_list.html删除预告链接 ```html <a class="label label-danger" href="{{ url_for('admin.preview_delete', delete_id=preview.id) }}">删除</a> ``` ![BLOG_20181111_201552_53](/media/blog/images/2018/11/BLOG_20181111_201552_53.png "博客图集BLOG_20181111_201552_53.png") ### 编辑预告 #### 增加preview_update预告修改视图 同样使用**preview_edit.html**视图 ```python @admin.route("/preview/update/<int:update_id>/", methods=['GET', 'POST']) @admin_login_require def preview_update(update_id=None): preview = Preview.query.get_or_404(update_id) form = PreviewForm( title=preview.title, ) # 不验证上传文件 form.logo.validators = [] form.logo.render_kw = {'required': False} if form.validate_on_submit(): data = form.data if Preview.query.filter_by(title=data['title']).count() == 1 and preview.title != data['title']: flash('预告标题已存在,请重新输入', category='err') return redirect(url_for('admin.preview_update', update_id=update_id)) preview.title = data['title'] print(data['logo'], type(data['logo']), form.logo.data, type(form.logo.data)) # <FileStorage: 'ssh.jpg' ('image/jpeg')> <class 'werkzeug.datastructures.FileStorage'> # <FileStorage: 'ssh.jpg' ('image/jpeg')> <class 'werkzeug.datastructures.FileStorage'> # 上面两种方式结果一样 # 文件保存路径操作 file_save_path = app.config['UP_DIR'] # 文件上传保存路径 if not os.path.exists(file_save_path): os.makedirs(file_save_path) # 如果文件保存路径不存在,则创建一个多级目录 import stat os.chmod(file_save_path, stat.S_IRWXU) # 授予可读写权限 if form.logo.data: # 当有上传新的图片 if os.path.exists(os.path.join(file_save_path, preview.logo)): os.remove(os.path.join(file_save_path, preview.logo)) # 删除旧图片 file_logo_name = form.logo.data.filename preview.logo = change_filename(file_logo_name) # 得到新的文件名,保存到输入局 form.logo.data.save(file_save_path + preview.logo) db.session.commit() flash('预告信息修改成功!', category='ok') return redirect(url_for('admin.preview_update', update_id=update_id)) return render_template('admin/preview_edit.html', form=form, preview=preview) ``` #### 修改预告直接使用preview_edit.html模板 ![BLOG_20181111_201622_73](/media/blog/images/2018/11/BLOG_20181111_201622_73.png "博客图集BLOG_20181111_201622_73.png") 当文件名存在时,会提示已存在。 ![BLOG_20181111_201631_90](/media/blog/images/2018/11/BLOG_20181111_201631_90.png "博客图集BLOG_20181111_201631_90.png")
很赞哦! (0)
相关文章
文章交流
- emoji
当前用户
未登录,点击 登录专题目录
- 【Flask微电影】01.环境搭建项目目录分析
- 【Flask微电影】02.使用蓝图构建项目目录
- 【Flask微电影】03.安装mysql数据库及配置
- 【Flask微电影】04.定义数据模型,生成数据表和初始用户
- 【Flask微电影】05.搭建前台页面-会员登录注册和会员中心
- 【Flask微电影】06.搭建前台页面-电影列表、搜索播放页面
- 【Flask微电影】07.搭建后台页面-后台登陆、后台主页页面
- 【Flask微电影】08.搭建后台页面-密码修改、主页控制面板
- 【Flask微电影】09.搭建后台页面-标签管理、电影管理、预告管理
- 【Flask微电影】10.搭建后台页面-会员管理、评论管理
- 【Flask微电影】11.搭建后台页面-收藏管理、日志管理
- 【Flask微电影】12.搭建后台页面-权限管理、角色管理、管理员管理
- 【Flask微电影】13.管理员登录、退出、装饰器进行访问控制
- 【Flask微电影】14.电影标签管理:增删查改
- 【Flask微电影】15.电影内容管理:增删查改
- 【Flask微电影】16.电影预告管理:增删查改
- 【Flask微电影】17.网站会员管理:查看会员和删除
- 【Flask微电影】18.电影评论管理:评论列表和删除
- 【Flask微电影】19.用户收藏电影:收藏列表和删除
- 【Flask微电影】20.会员修改密码,表单下拉列表同步数据库
- 【Flask微电影】21.基于角色访问控制-权限管理:增删查改
- 【Flask微电影】22.基于角色访问控制-角色管理:增删查改
- 【Flask微电影】23.基于角色访问控制-管理员管理和访问权限控制
- 【Flask微电影】24.前台会员中心,会员注册登录退出
- 【Flask微电影】25.会员中心登录要求,会员资料和密码修改
- 【Flask微电影】26.电影会员评论、会员登录日志、会员收藏列表
- 【Flask微电影】27.电影页面上映轮播预告,搜索、标签筛选列表
- 【Flask微电影】28.电影播放详情,评论,显示评论列表
- 【Flask微电影】29.电影收藏功能,增加电影播放弹幕
- 【Flask微电影】30.项目完成检查,nginx部署网站