反向解析
通过别名解析出一个结果,该结果可以访问到对应的url并执行视图函数
无名分组
url(r‘^index/(\d+)/‘,views.index,name=‘index_view‘)
reverse(‘index_view‘,args(123,))
{% url ‘index_view‘ 123 %}
有名分组
url(r‘^index/(?P<user_id>\d+)/‘,views.index,name=‘index_view‘)
reverse(‘index_view‘,kwargs={‘user_id‘:123}
{% url ‘index_view‘ user_id=123 %}
# 有名分组也可以使用无名分组反向解析的传参方式
?
用户的增删改查(反复练习)
路由分发
在django中所有的应用都可以有自己的urls.py static templates
基于上述特性 使用django做分组开发会非常的方便
最后的项目合并只需要将所有人的app全部拷贝一个新的django项目
利用路由分发即可完成整体联通
?
总路由(分发)
url(r‘^应用前缀/‘,include(‘应用名.路由层‘))
子路由(匹配)
url(r‘^路由/‘,views.视图函数内存地址)
# 总路由的结尾千万不能加$符号
名称空间
当多个应用出现起别名冲突的情况可以使用名称空间来区分
总路由(分发)
url(r‘^应用前缀/‘,include(‘应用名.路由层‘,namespace=‘名称‘))
reverse(‘名称:别名‘)
{% url ‘名称:别名‘%}
# 如果你能够确保所有的应用都没有别名冲突的情况 那么名称空间可以不用
伪静态网页
url地址结尾.html
# 百度一下SEO 竞价 ......
本地虚拟环境
针对不同的项目配置不同的解释器环境
1.pycharm
2.命令行形式创建
# ps:学习期间尽量就不要使用虚拟环境 所有的模块全部下载到本地
django版本区别
1.路由层
url与path
re_path
转换器
自定义转换器
2.模型层
外键参数
JsonResponse
1.json模块
json.dumps(ensure_ascii)
2.JsonResponse模块
JsonResponse(json_dumps_params,safe)
# 阅读源码并分析推导的能力
作业讲解
form表单上传文件
FBV与CBV(重要)
CBV源码分析(记忆)
模板层(模板语法)
模板语法传值
?
模板语法过滤器(内置方法)
?
模板语法标签(流程控制)
?
自定义过滤器和标签(了解)
模板的导入与继承(面向对象)
# 源码只可以看 千万不要随意上手 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 基于函数的视图 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())
# 切入点 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 %}
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.整理今日内容 2.周日下午自行整理本周所有内容 3.没有完成的 继续完成用户增删改查
原文:https://www.cnblogs.com/chijintao/p/14797456.html