• 1.form表单上传文件

  • 2.FBV与CBV(重要)

  • 3.CBV源码分析(记忆)

  • 4.模板层(模板语法)

      1.模板语法传值
      2.模板语法过滤器(内置方法)
      3.模板语法标签(流程控制)
      4.自定义过滤器和标签(了解)
    
  • 5.模板的导入与继承(面向对象)

题目讲解

题干:

	from datetime import datetime
	import json
	自己写一个类 替换掉cls
	d = {'t1':datetime.today()}
	res = json.dumps(d)
	print(res)
# 源码只可以看 千万不要随意上手  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.form表单上传文件

必须要指定的参数	
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')

2.FBV与CBV

FBV

			基于函数的视图	
			FBV使用频率较低(基础阶段)

CBV

			基于类的视图	 
			CBV实际开发项目使用频率较高(高级阶段)

views.py视图层 视图 不仅仅可以是函数也可以是类 1.面向过程式编程
2.面向对象式编程
FBV

def index(request):    
return HttpResponse('')

CBV 视图层代码

from django.views import Viewclass Mylogin(View):    
def get(self,request):        
return HttpResponse('get方法')    
def post(self,request):        
return HttpResponse('post方法')

路由层代码 url(r'^login/', views.Mylogin.as_view())

3.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,...)

4.模板层

4.1模板语法传值

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())

4.2模板语法取值

取值只能使用句点符(.)

<p>{{ l.0 }}</p>
<p>{{ d.username }}</p>
<p>{{ d.hobby.3.addr }}</p>

4.3模板语法之过滤器(内置方法)

<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 = '一级标题'
ht1 = mark_safe(ht1)

4.4模板语法之标签(流程控制)

{{}}	         变量相关(引用变量值)
{%%}	    逻辑相关(流程控制 模块方法)

<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 %}

4.5自定义过滤器、标签、inclusion_tag

自定义准则之3步操作:

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)

自定义inclusiontag(自行概括)

@register.inclusion_tag(filename='ccc.html',name='myinc')
def index(n):    
		new_l = ['第%s页'%i for i in range(1,n+1)]    
		return locals()