Flask,get到的一些知识点(个人向)

更新提醒

从2018年3月3日开始会对更新时间和内容进行介绍
1. 2018年3月3日 11点24分 ——-> 一、3小点( selectfield数据无法及时更新问题)进行了修改 点击跳转
2. 2018年3月3日 16点19分 ——-> 二、3小点(级联删除)进行了修改,删除了原来所写的内容,并对其进行完善 点击跳转
3. 2018年3月3日 23点12分 ——-> 八、(summernote插件)新增了对summernote读取内容的介绍 点击跳转
4. 2018年3月4日 10点19分 ——-> 八、(summernote插件)新增了用红色标注的特别提示 点击跳转
5. 2018年3月5日 17点49分 ——-> 二、(数据库的高级查询)新增了数据库的高级查询 点击跳转
6. 2018年3月6日 13点59分 ——-> 六、(Jinja2)新增了数据库中的dateime格式在页面中显示date格式 点击跳转
7. 2018年3月6日 14点09分 ——-> 二、(数据列表翻转reverse())新增了数据列表翻转reverse() 点击跳转
8. 2018年3月6日 17点42分 ——-> 七、(database插件)对内容进行了完善 点击跳转
9. 2018年3月7日 10点15分 ——-> 二、(数据库的高级查询)新增了new 点击跳转
10. 2018年3月7日 16点51分 ——-> 九、(pycharm相关)新增了pycharm相关 点击跳转
11. 2018年3月8日 16点56分 ——-> 二、(关于对象关系的理解)新增了蓝字部分 点击跳转
12. 2018年3月8日 16点58分 ——-> 六、(模板空格去除)新增了模板空格去除 点击跳转
13. 2018年3月8日 17点05分 ——-> 六、(datetime的计算)新增了datetime的计算(6.2.2) 点击跳转
14. 2018年3月8日 17点05分 ——-> 二、(datetime相关)新增了datetime相关(2.6) 点击跳转
15.2018年3月9日 23点14分 ——-> 十、(sweet-alert插件)sweet-alert插件(10) 点击跳转
16.2018年3月11日 20点44分 ——-> 十一、(flask-mail邮箱配置及使用)新增flask-mail邮箱配置及使用 点击跳转
17.2018年3月12日 12点21分 ——-> 七、(database插件)新增7.2 控制Datatables元素的位置(dom) 点击跳转
18. 2018年3月27日 21点47分 ——-> 十二、(morris.js插件)新增十二、 morris.js插件 点击跳转
19. 2018年3月27日 23点36分 ——-> 十三、(Highcharts插件)新增十三、Highcharts插件 点击跳转
20. 2018年3月28日 13点44分 ——-> 十四、(Arrow-一个最好用的日期时间Python处理库)新增十四、Arrow-一个最好用的日期时间Python处理库 点击跳转

特别标注:本篇文章所讲述的代码均来自个人项目  Online-Registration  对此项目有什么相关建议欢迎在评论下提出。

一、wtf表单

  1. html生成时,属性指向

    1. forms.py
      name = StringField(
      label="添加新闻类别",
      validators=[
      DataRequired("请输入新闻类别")
      ],
      description="新闻类别",
      render_kw={
      "class": "form-control",
      "id": "add_info",
      "placeholder": "请输入新闻类别",
      } # 附加选项
      )


    2. xxx.html

      {{ form.name.label(for='add_info', class='form-margin') }}
      {{ form.name }}


      get到,label那里可以自己加属性
  2. 表单属性

    http://wtforms.simplecodes.com/docs/0.6.1/fields.html
    用此文档解决了selectfield动态选择数据

  3. selectfield数据无法及时更新问题

    form.py中一开始是先从数据库中查询数据出来,然后在selectfield的choices中塞进去查询出来的数据。此方法不能及时更新数据,故不建议使用。代码如下
    在views.py的相应功能函数中添加如下代码:

    # 每次刷新列表
    form.category.choices = [(v.id, v.name) for v in NewsCategory.query.all()]
    

    注:以上代码均在views.py中
    参考网站:https://segmentfault.com/q/1010000011641873

二、数据库相关

  1. 数据库(整个)删除后报错问题

    https://segmentfault.com/q/1010000005649683
    https://stackoverflow.com/questions/7191758/how-to-set-up-a-table-with-a-recursive-foreign-key-and-a-relationship-declarativ

  2. 关于对象关系的理解

    Flask,get到的一些知识点(个人向)_第1张图片
    get到relationship中的backref=”外键名(tlevel)”,在引用表(Tinfo)中通过对象(tinfo).外键名(tlevel).属性(level)

  3. 级联删除

    解决了一对多级联删除中,删掉一(主)表但是多(参考)表中外键为空,数据行仍在多(参考)表的问题,代码如下:

    newscategory:# 新闻类别 
    class NewsCategory(db.Model):
    其余的代码均舍弃,挑重要的写出来
    newstags = db.relationship("NewsTag", backref='newscategory', cascade='all, delete-orphan', lazy='dynamic',passive_deletes=True)

    newtag:# 新闻标签
    class NewsTag(db.Model):
    其余的代码均舍弃,挑重要的写出来
    newscategory_id = db.Column(db.Integer, db.ForeignKey('newscategory.id', ondelete='CASCADE'))
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)
    newsinfos = db.relationship('NewsInfo', backref='newstag', cascade='all, delete-orphan', lazy='dynamic', passive_deletes=True)
    

    以上代码均在models.py中

  4. 数据库的高级查询

    Online-Registration的admin/view.py中的代码为例:

    oplog_list = Oplog.query.order_by(
        Oplog.addtime.asc()
    )
    oplog_book_list = oplog_list.filter(Oplog.opdetail.like('%参考书%'))
    oplog_book_list = oplog_book_list[oplog_book_list.count() - 3:]

    New:ilike以及其它的用法,参考网站:https://www.jianshu.com/p/5a27a826866e
    参考网站:http://www.cnblogs.com/huangxm/p/6295102.html
    解析:Oplog为数据库中的表,opdetail为其表中的一列,like为模糊匹配。对oplog_list里的数据进行模糊匹配,找出带有参考书样式的日志集合,其次找出后三条相关数据。

    参考网站:https://www.bbsmax.com/A/A2dmNGBnze/

  5. 数据列表翻转reverse()

    oplog_book_list = oplog_list.filter(Oplog.opdetail.like('%参考书%'))
    oplog_book_list = oplog_book_list[oplog_book_list.count() - 3:]
    oplog_book_list.reverse()
    return render_template("admin/index.html", oplog_book_list=oplog_book_list)

    结果如下
    Flask,get到的一些知识点(个人向)_第2张图片
    参考网站:http://blog.csdn.net/guoziqing506/article/details/51966025

  6. datetime相关

    参考网站:http://www.wklken.me/posts/2015/03/03/python-base-datetime.html

三、正则表达式

https://c.runoob.com/front-end/854

四、上传相关


  1. 上传时,form表单一定要加上:
    enctype="multipart/form-data"
  2. 多文件上传(插件为:bootstrap-fileinput)

官网:https://github.com/kartik-v/bootstrap-fileinput
其他:http://www.os373.cn/article/81
其他:http://blog.csdn.net/qq_28550739/article/details/53436080
其他:http://blog.csdn.net/u012526194/article/details/69937741

1 给input添加multiple属性(或者在forms.py中的render_kw添加此属性)

{{ form.img(multiple="multiple")}}

2 在获取文件时从request对象获取,并迭代保存

from flask import request
...
for filename in request.files.getlist('photo'):
    photos.save(filename)
...

3 views.py中

 for imgs in request.files.getlist('img'): 
print(imgs)
注:imgs有filename的属性

img为forms.py中的属性,完整步骤见下图
Flask,get到的一些知识点(个人向)_第3张图片
详见知乎专栏: https://zhuanlan.zhihu.com/p/24429519

五、个人中心数据传递(理解get方式时的数据传递)

views.py

@registration.route("/userinfo/", methods=["GET", "POST"])
def userinfo():
    form = UserInfoForm()
    user = User.query.filter_by(id=session['user_id']).first_or_404()
    if request.method == "GET":
        form.gender.data = user.gender
        form.id_card.data = user.id_card
        form.phone.data = user.phone
        form.area.data = user.area
    if form.validate_on_submit():
        pass
    return render_template("registration/userinfo.html", form=form, user=user)

userinfo.html(摘取2部分)

{{ form.email(value=user.email) }}


{{ form.gender }}

六、Jinja2

1 for的一个小用法,loop.index。能自动生成序列(1开始)排序

{% for value in page_data %}
    
        {{ loop.index }}
        {{ value.user.name }}
        {{ value.user.email }}
        {{ value.ip }}
        {{ value.addtime }}
    
{% endfor %}

2 数据库中的dateime格式在页面中显示date格式

datetime有一个这样的方法:date_time.strftime('%Y-%m-%d')
故在jinja2前台显示的时候可以这样写:
{{ newscategory.addtime.strftime('%Y-%m-%d') | safe }}
注: newscategory.addtime为datetime格式

结果如下
结果如下
参考网站:https://www.jianshu.com/p/ba8492753ef6

2.2 由于Jinja2模板不支持datetime类型的值,故在views.py中将值列好传递至template。(机智的网友们)
部分代码如下:

import datetime 
now = datetime.datetime.strptime(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "%Y-%m-%d %H:%M:%S")
time_diff = datetime.timedelta(days=30)

参考网站: https://stackoverflow.com/questions/26718664/how-to-compare-two-dates-in-jinja2

3 模板空格去除

参考网站:http://greyli.com/flask-template-engine-jinja2-syntax-introduction/

七、database插件

databases特性
http://datatables.club/reference/option/

"lengthChange":false,  //隐藏左上角Length页面  
"searching": false,     //隐藏右上角本地搜索
"info": false,  //隐藏左下角提示信息

测试界面如图:
Flask,get到的一些知识点(个人向)_第4张图片
同时,这是bootstrap风格的分页,变成图中界面的相关js和css文件为:
js文件


                    
                    

你可能感兴趣的:(flask)