zoukankan      html  css  js  c++  java
  • DAY 48 django03

     

    • 路由分发

      在django中所有的应用都可以有自己独立的路由层、模板层、静态文件

      路由分发是为了解决总路由代码过于冗余的情况

      include('应用名.urls')

      注意事项
      总路由最后千万不要加$
    • 名称空间

       当多个应用出现反向解析起别名冲突的情况
      include('应用名.urls',namespace='自定义名称空间名字')
      reverse('自定义名称空间名字:别名')
      {% url '自定义名称空间名字:别名' %}
      # 名称空间其实也可以不使用 只要我们做到所有的别名不冲突即可,eg:在每个别名前面加上各自应用名作为前缀
    • 本地虚拟环境

      类似于docker容器,给每个项目配备独立的运行环境
      ps:requirements.txt

      创建虚拟环境类似于重新下载了一个纯净的python解释器
    • django版本区别

      1.路由层使用的方法不一样
      url()
         path()
        re_path() == url()
      2.转换器
      3.2.X与3.X区别
      3.X新增了异步功能
    • 三板斧本质

      返回HttpResponse对象
    • JsonResponse

      JsonResponse(obj,json_dumps_params,safe)
      ps:看源码学习的好处
    • FBV与CBV及源码

      FBV
      def index(request):
           return HttpResponse('index')
      CBV
      from django.views import View
         class MyClassView(View):
             def get(self,request):
                 return HttpResponse('get')
             def post(self,request):
                 return HttpResponse('post')
         url(r'^login/',views.MyClassView.as_view())
      # 为什么能够根据前期方式的不同自动匹配执行对应的方法
      class View(...):
         @classonlymethod
         def as_view(...):
             def view(...):
                 obj = cls(...)
                 return self.dispatch(...)  # 面向对象属性查找顺序
            return view  # FBV与CBV路由匹配其实是一样的
         def dispatch(...):
             if request.method.lower() in [8个方法]:
                 handler = getattr(self,request.method.lower(),'报错')
             else:
                 handler = '报错'
             return handler(...)
    • django settings源码

    • 模板语法传值

    • 模板语法之过滤器

    • 模板语法之标签

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

    • 模板的继承

    • 模板的导入

    • 模型层(单表查询关键字)

    django settings源码

    """
    1.django其实有两个配置文件
    一个是暴露给用户可以自定义的配置文件
    项目根目录下的settings.py
    一个是项目默认的配置文件
    当用户不做任何配置的时候自动加载默认配置
    2.配置文件变量名必须是大写
    """
    疑问:为什么当用户配置了就使用用户配置的 不配置就是要默认的
    from django.conf import settings

    settings = LazySettings()

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day05.settings")
    ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"
    class LazySettings(LazyObject):
       def _setup(self, name=None):
           # os.environ看成是一个全局大字典     'day05.settings'
           settings_module = os.environ.get(ENVIRONMENT_VARIABLE)
           self._wrapped = Settings(settings_module)  # Settings('day05.settings')

    class Settings(object):
       def __init__(self, settings_module):  # 'day05.settings'
           for setting in dir(global_settings):  # 获取全局配置文件里面所有的变量名
               if setting.isupper():  # 校验是否是纯大写
                   setattr(self, setting, getattr(global_settings, setting))
                   # 给Settings对象添加全局配置文件中所有的配置信息
           
           self.SETTINGS_MODULE = settings_module  # 'day05.settings'
           mod = importlib.import_module(self.SETTINGS_MODULE)
           # from day05 import settings # 导入暴露给用户的自定义配置文件
           for setting in dir(mod):
               if setting.isupper():
                   setting_value = getattr(mod, setting)
                   setattr(self, setting, setting_value)

    模板语法之传值

    # 传值方式1:利用字典挨个传值
    return render(request,'index.html',{'i':i,'f':f,'s':s})
    # 传值方式2:简单粗暴 locals()将当前名称空间中所有的变量名全部传递给页面
    return render(request,'index.html',locals())

    """
      传值方式1 传值精确 不会造成资源浪费
      传值方式2 传值粗糙 可能会造成一定的资源浪费
      ps:为了教学方便 我们以后就是用locals()
    """
    补充:传递函数名和类名都会自动加括号调用(模板语法不支持额外的传参)

    模板语法之获取值

    '''django模板语法取值只能采用  句点符(.) '''
    索引 键都可以无限制的点点点
    <p>{{ d.hobby.3.username }}</p>

    模板语法之过滤器

    # 类似于python的内置方法
    <p>过滤器:将竖杆左侧的数据当做第一个参数</p>
    <p>统计长度:{{ s|length }}</p>
    <p>加法运算:{{ i|add:100000000000 }}</p>
    <p>字符串拼接:{{ s|add:'heiheihei' }}</p>
    <p>日期格式:{{ ctime|date:'Y年-m月-d日' }}</p>
    <p>默认值:{{ b|default:'哈哈' }}</p>
    <p>默认值:{{ b1|default:'哈哈' }}</p>
    <p>文件大小:{{ file_size|filesizeformat }}</p>
    <p>截取文本(三个点也算):{{ s|truncatechars:6 }}</p>
    <p>截取文本(三个点不算)空格:{{ s|truncatewords:3 }}</p>
    <p>{{ h|safe }}</p>
    <p>{{ sss }}</p>
    <p>{{ sss1 }}</p>

    转义
    前端
      |safe
       后端
      from django.utils.safestring import mark_safe
      sss1 = mark_safe('<h2>老子要挣大钱</h2>')
       ps:前端代码也可以在后端写好传入!!!

    模板语法之标签

    # 类似于python的流程控制
    {% for foo in s %}
      {% if forloop.first %}
           <p>这是我的第一次~~</p>
      {% elif forloop.last %}
           <p>这是最后一次了啊~</p>
      {% else %}
           <p>{{ foo }}</p>
      {% endif %}
       
      {% empty %}
           <p>传入的数据是空的</p>
    {% endfor %}

    """
    {{}} 变量相关
    {%%} 逻辑相关
    """
    # 了解
    {% with d.hobby.3.username as name %}
      {{ name }}
      {{ d.hobby.3.username }}
    {% endwith %}

    自定义过滤器、标签、inclusion_tag

    # 类似于python里面的自定义函数
    1.在应用下创建一个名字必须叫"templatetags"文件夹
    2.在上述文件夹内创建一个任意名称的py文件
    3.在该py文件内固定先书写以下两句话
    from django import template
       register = template.Library()
       

    # 自定义过滤器
    @register.filter(name='myfilter')
    def index(a,b):
       # 简单的加法运算
       return a + b


    # 自定义标签
    @register.simple_tag(name='mysimple')
    def func1(a,b,c,d):
       return '%s-%s|%s?%s'%(a,b,c,d)


    # 自定义inclusion_tag
    @register.inclusion_tag('login.html',name='my_inclusion_tag')
    def func2(n):
       l = []
       for i in range(1,n+1):
           l.append('第%s页'%i)
       return locals()


    前端
    {% load mytag %}
    {{ i|myfilter:666 }}

    {% mysimple 1 'jason' 222 'egon' %}

    {% my_inclusion_tag 10 %}
    {% my_inclusion_tag 8 %}

    inclusion_tag
    当某个区域需要反复使用并且数据不是固定的

    模板的导入

    # 类似于后端到模块 想要什么局部页面直接导入即可

    {% include 'myform.html' %}

    模板的继承

    先使用block划定区域
    母版
      {% block 区域名称 %}
      {% endblock %}
    子版
    {% extends 'home.html' %}
      {% block 区域名称 %}
    {% endblock %}
     
    母版在划定区域的时候一般都应该有三个区域
      css区域
      html文档区域
      js区域
      ps:目的是为了让子版具有独立的css js等 增加扩展性
      {% block css %}

      {% endblock %}
       
      {% block content %}

      {% endblock %}
       
      {% block js %}

      {% endblock %}

    ps:子版也可以继续使用母版划定区域内的内容
      {{ block.super }}
  • 相关阅读:
    Oracle数据导出到MySql
    ORA04031 shared_pool 不能分配足够内存或磁盘碎片
    IDEA那些好用的插件
    MySQL基础篇增删改查
    SpringBoot项目部署在阿里云
    三、Mybatis相应API
    chrome的书签备份
    redis踩坑
    四、Mybatis的Dao层实现
    MySQL基础篇函数
  • 原文地址:https://www.cnblogs.com/DEJAVU888/p/14893575.html
Copyright © 2011-2022 走看看