首页 > 其他 > 详细

05:Django(视图层完+模板层部分)

时间:2021-05-22 00:02:55      阅读:35      评论:0      收藏:0      [点我收藏+]

昨日内容回顾

  • 无名有名反向解析

    反向解析
    通过别名解析出一个结果,该结果可以访问到对应的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
"""

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

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.整理今日内容
2.周日下午自行整理本周所有内容
3.没有完成的 继续完成用户增删改查

 

 

 

05:Django(视图层完+模板层部分)

原文:https://www.cnblogs.com/chijintao/p/14797456.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!