Python实例---基于页⾯的后台管理[简单版]
后台管理菜单 + 母板[css/content/js]
向后台提交数据[2种]:
1.  模态对话框(数据少操作,且Js复杂):
form表单:优点:简单,前端提交后后台处理完成后直接redirect;
缺点:⽆法显⽰错误信息
Ajax提交 :
- 有错误,显⽰错误;⽆错误,通过js的 lad() 刷新页⾯
- 有错误,显⽰错误;⽆错误,⾃⼰局部添加
[Jquery的委托绑定 $('⽗集').on('click','⼦集',function(){})]
- 注意后台返回给Ajax的数据以及是字符串[需要转换为JSON]
-
注释掉settings.py⾥⾯的CSRF
2. 单独页⾯提交数据(数据多,数据⼤操作):
form表单: ..
分页
Django分页:有⼀个类,定义好了⽅法
⾃定义分页:
- 数据从数据库来
-
编辑数据:
模态对话框:有⼀个隐藏ID
PS:通过for循环和⾃定义属性实现动态的赋值
可以根添加⽤⼀个对话框,在编辑的时候,需要把内容放在value⾥,id放⼊隐藏的标签内,点击提交后提交到编辑的URL
也可以通过单独的URL来进⾏编辑,需要动态传值[推荐]
简单讲有2中⽅式:
数据量⼩:对话框  --》判断格式,是否为空
数据量⼤;新URL
因为前端浏览器可以禁⽤,或者不⽤浏览器来进⾏后台的数据访问,所以所有的限制最好是在后台进⾏操作。
sql:  update tbl set caption='' where id = 1
orm:  models.Classes.objects.filter(id=1).update(caption='XXX')
删除:
弹出框 + 获取到ID后删除
[在模态对话框框的删除编辑页⾯内写⼀个input来获取当前的ID然后在后台进⾏删除]
JS有⼀个绑定事件⽅法onclick():
Jquery的on,on表⽰事件委托,点击的时候绑定事件类型然后执⾏某个函数[3个参数]
模板左侧菜单:
注意样式,CSS + Content + JS
分页:
封装成了⼀个组件然后去操作
⽂件上传:
XSS:
默认我们从后台反馈的所有字符串都按照字符串进⾏渲染,防⽌XSS攻击[⽐如有⼈评论我们的博客是,写的是⼀段JS代码,如果浏览器直接执⾏此代码的话,我们的页⾯会奔溃]
xss问题提出:
xss问题解决:
1. 后台控制
2.  前台控制
知识点回顾
1、数据库操作
- 单表操作
- all
- filter
models.tb.objects.filter(id=123)
dic = {'id': 123, 'age__gt': 3}
models.tb.objects.filter(**dic)
-
count
- order_by
...
- ⼀对多
# id    name
1      河北
2      ⼴东
3      ⼭东
class Province(models.Model):
name = models.CharField(max_length=32,)
# nid = models.Intergar(unique=True) # 唯⼀
# id    name      pro
1    东莞      2
2    深圳      2
3    惠州      2
4    河源      2
5    泰安      3
6    青岛      3
7    济南      3
8    张家⼝    1
9    邢台      1
class City(models.Model):
name = models.CharField(max_length=32)
pro = models.ForeignKey("Province", to_filed='id')
>>##故意写错参数字段然浏览器可以告诉我们字段
>>##正向反向都是根据left join来进⾏关联的
1、正向查【具有外键字段,3种⽅式】
result = models.City.objects.all()    --> 对象.XXX  取值
result[0].pro.name
# 2个下划线表⽰关联下⼀个表
models.City.objects.all().values('id','name','pro_id','pro__id','pro__name')    --> 拿到的是字典            models.City.objects.all().values_list('id','name','pro_id','pro__id','pro__name')  --> 拿到的是元组        2、反向查【3种⽅式】
result = models.Province.objects.values('id','name', 'city__name')
result = models.Province.objects.all()  # 多个数据
result[0]                  #  获取某个省
result[0].city_set      #  QuerySet类型. 返回None,因为我们可能获取全部也可以只获取部分
result[0].city_set.all()  #  获取河北下的所有市张家⼝、邢台
result[0].city_set.filter(id__lt=4)  #  获取河北下的所有市张家⼝、邢台
for pro in result:
a1 = pro.id
a2 = pro.name
a3 = pro.city_set.all()
print(a1,a2,a3)
=====> 多对多即使基于⼀对多来构造
多对多【看1.5/1.6章节内容】
2、cookie,session必须要会
3、分页
4、    def index(request):
('k')
# checkbox  --注意name相同,
# select[multiple]的多选 --name可以不同
list('k')    # 获取全部的前台内容
5、模板语⾔进⾏渲染的时候,调⽤函数不需要带括号()
模版引擎渲染字典
6、包含和不包含的使⽤:
python json字符串转数组
7、JQuery和DOM对象之间的转换
8、关于实现前台展⽰教师以及选择的班级:
$('#sel').val()    --> 再开⼀个select,将这些内容在放⼊⼀次
后台取出数据后  --> 再开⼀个select,将这些内容selected⼀次
利⽤DOM的selectedoptions和Jquery的appendTO⽅法结合
9、模版语⾔获取数组内容:
10、form表单的onclick
11、三元运算符复习
⽂件上传
⽂件上传⼀:基于Form表单:只要已上传,页⾯就会刷新
未添加:
添加后:
⽂件上传位置:
浏览器直接访问:因为Django⾥⾯进⾏了设置,static默认指引到statics⽬录下所以我们只需要在数据库内保存⽂件的路径即可。
【引申】
创建IMG的model,⾥⾯有path参数,然后migtations创建数据库
将⽂件写⼊本地的同时将路径写⼊数据库,下次访问的时候取数据库内取数据<img src="/{{ imgItem }}">
⽂件上传⼆:Ajax上传
要求:
悄悄上传⽂件  [1. xmlHttpRequest对象实现原⽣Ajax    2.jQuery实现Ajax]
特别推荐:利⽤FormDate对象来传递数据。
后显⽰⽂件内容
⽂件上传三:基于form表单和iframe⾃⼰实现Ajax上传
兼容性好,因为早期的浏览器不⽀持formdata
其他

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论