提高作业
# 源码只可以看 千万不要随意上手 xadmin iview (odoo框架)
# stackoverflow
from datetime import date,datetime,timedelta
import json
# current_time = date.today()
# print(current_time + timedelta(days=-3))
class MyJsonEncode(json.JSONEncoder):
def default(self, o):
# o就是当前即将被序列化的数据对象
if isinstance(o,date):
return o.strftime('%Y-%m-%d')
elif isinstance(o,datetime):
return o.strftime('%Y-%m-%d %H:%M:%S')
return o
d = {'ctime1':date.today(),'ctime2':datetime.today()}
res = json.dumps(d,cls=MyJsonEncode)
print(res)
"""
TypeError: Object of type datetime is not JSON serializable
"""
必须要指定的参数
1.method='post'
2.enctype='/multipart/form-data/'
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="myfile" multiple>
<input type="submit" class="btn btn-primary btn-block">
</form>
def index(request):
if request.method == 'POST':
# print(request.POST)
# print(request.GET)
# print(request.FILES) # 获取文件数据
file_obj = request.FILES.get('myfile')
print(file_obj.name) # 获取文件名
with open(file_obj.name,'wb') as f:
for chunk in file_obj.chunks():
f.write(chunk)
return render(request,'index.html')
FBV与CBV
FBV 基于函数的视图
FBV使用频率较低(基础阶段)
CBV 基于类的视图
CBV实际开发项目使用频率较高(高级阶段)
views.py视图层
视图函数
不仅仅可以是函数也可以是类
1.面向过程式编程
2.面向对象式编程
# FBV
def index(request):
return HttpResponse('')
# CBV
视图层代码
from django.views import View
class Mylogin(View):
def get(self,request):
return HttpResponse('get方法')
def post(self,request):
return HttpResponse('post方法')
路由层代码
url(r'^login/', views.Mylogin.as_view())
CBV源码
# 切入点
url(r'^login/', views.Mylogin.as_view())
'''类名点名字还加括号 名字要么是绑定给类的方法 要么是无参函数'''
1.as_view()绑定给类的方法
@classonlymethod
def as_view(cls, **initkwargs)
2.CBV路由匹配本质与FBV一致
# CBV
url(r'^login/', views.Mylogin.as_view())
# CBV本质
# url(r'^login/', views.view)
3.匹配成功之后执行view函数代码
def view(request, *args, **kwargs):
self = cls(**initkwargs)
return self.dispatch(request, *args, **kwargs)
4.查看dispatch方法(对象查找属性和方法一定要严格按照顺序来)
def dispatch(self, request, *args, **kwargs):
# 判断当前请求方法是否符合八个默认的请求方法中
# 1.get
if request.method.lower() in self.http_method_names:
# getattr(对象,'get','拿不到的报错信息') >>> Mylogin里面的get方法
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) # get(request,...)
模板层之模板语法传值
https://www.cnblogs.com/Dominic-Ji/articles/11109067.html#_label15
注释
<!--HTML注释--> 浏览器能够查看
{#模板语法注释#} 浏览器查看不了
def reg(request):
# python基本数据类型
f = 1.1
i = 11
s = 'hello world'
l = [11,22,33,44]
d = {'username':"jason",'password':123}
t = (11,22,33,44,55,66,77)
se = {11,22,33,44,55,66}
b = True
# 函数(自动加括号调用函数 展示的是函数的返回值)
def func(args): # 模板语法不支持给函数传递额外的参数
print('from func')
return '下午有点困'
# 面向对象
class MyClass(object): # 自动加括号实例化产生对象
def get_obj(self):
return 'from obj'
@classmethod
def get_cls(cls):
return 'from cls'
@staticmethod
def get_func():
return 'from func'
obj = MyClass()
# 1.指名道姓的传(需要传的值较少)
# return render(request,'reg.html',{...})
# 2.一次性批量传(效率偏低) 为了教学方便我们使用locals居多
# return render(request, 'reg.html',locals())
return render(request,'reg.html',locals())
模板语法取值
取值只能使用句点符(.)
<p>{{ l.0 }}</p>
<p>{{ d.username }}</p>
<p>{{ d.hobby.3.addr }}</p>
模板语法之过滤器(内置方法)
<p>过滤器: 管道符 左侧当做过滤器的第一个参数 右侧有时候还可以支持再传一个参数(冒号开头)</p>
<p>统计长度:{{ l|length }}</p>
<p>自增运算:{{ i|add:123 }}、拼接操作:{{ s|add:'去你妹的' }}</p>
<p>日期转换:{{ ctime }}、{{ ctime|date:'Y-m-d' }}</p>
<p>文件大小:{{ file_size|filesizeformat }}</p>
<p>截取字符(三个点也算):{{ desc|truncatechars:6 }}</p>
<p>截取单词(三个点不算):{{ desc|truncatewords:3 }}</p>
<p>切片操作:{{ s|slice:'0:4' }}</p>
<p>默认值(判断布尔值):{{ b|default:'这个东西布尔值是False' }}</p>
<p>文本转义:{{ ht|safe }}</p>
<p>文本转义:{{ xss }}</p>
<p>文本转义:{{ ht1 }}</p>
后端转义
from django.utils.safestring import mark_safe
ht1 = '<h1>一级标题</h1>'
ht1 = mark_safe(ht1)
模板语法之标签(流程控制)
{{}} 变量相关(引用变量值)
{%%} 逻辑相关(流程控制 模块方法)
<p>标签: 流程控制</p>
{% for i in lll %}
{% if forloop.first %}
<p>这是我的第一次循环</p>
{% elif forloop.last %}
<p>这是我的最后一次循环</p>
{% else %}
<p>{{ i }}</p>
{% endif %}
{% empty %}
<p>该对象里面没有值</p>
{% endfor %}
自定义过滤器、标签、inclusion_tag
1.在应用下创建一个名字必须叫templatetags文件夹
2.在该文件夹内创建一个任意名称的py文件
3.在py文件内必须要书写两行固定的代码
from django.template import Library
register = Library()
# 自定义过滤器
@register.filter(is_safe=False,name='aaa')
def my_plus(a,b):
return a + b
# 自定义标签(自定义函数)
@register.simple_tag(name='bbb')
def func(a,b,c,d):
return '%s-%s-%s-%s'%(a,b,c,d)
# 自定义inclusion_tag(自行概括)
@register.inclusion_tag(filename='ccc.html',name='myinc')
def index(n):
new_l = ['第%s页'%i for i in range(1,n+1)]
return locals()
模板的继承(使用频率较高)
需求
页面主体不变 部分区域变化
模板继承
1.需要现在母版中使用block提前划定区域
{% block 区域名称 %}
{% endblock %}
2.在子版中先继承再局部替换
{% extends '母版.html' %}
{% block 区域名称 %}
{% endblock %}
总结
母版一般情况下都应该至少含有三个区域
css区域
content区域
js区域
补充
{{ block.super }} 调用母版内容
模板的导入(了解)
{% include 'myform.html' %}