zoukankan      html  css  js  c++  java
  • 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)
    

    列表编辑、数据删除略。

  • 相关阅读:
    【插件开发】—— 10 JFace开发详解
    百度地图POI数据爬取,突破百度地图API爬取数目“400条“的限制11。
    Python3中遇到UnicodeEncodeError: 'ascii' codec can't encode characters in ordinal not in range(128)
    Python 3.X 要使用urllib.request 来抓取网络资源。转
    python创建目录保存文件
    Python返回数组(List)长度的方法
    python中for、while循环、if嵌套的使用
    (转)python3 urllib.request.urlopen() 错误UnicodeEncodeError: 'ascii' codec can't encode characters
    python 之 string() 模块
    (转)Python3异常-AttributeError: module 'sys' has no attribute 'setdefaultencoding
  • 原文地址:https://www.cnblogs.com/wyy5552/p/8577349.html
Copyright © 2011-2022 走看看