zoukankan      html  css  js  c++  java
  • Django --总结 之URL路由控制 视图相应,视图请求,和模板语法

    URL路由控制

    1. Djaong第一站就是进控制路由,找到访问路径需要分发到那个视图中去,找到路径就去调用相应的视图函数
      re_path(r"my_app/",include("my_app.urls")) #去父路径是my_app,然后去my_app的路由中找接下来的路径
      #假设下面是my_app应用中的Urls,那么完整的路径是/my_app/mytest/2003,然后执行my_app下的view视图中的my_test函数
      path("mytest/2003",my_test,name="mytest_reverse"), 
    
      #路由路径如果不能写死,还要用==**分组**==进行对路径正则的匹配 或者用path内置的自定义
      re_path(r"^case3/([0-9]{4,})/([0-9]{2})/$",case03)
    
      #然后默认有名分组是按照变量名的定义先后顺序传参,如果获取参数时候要按照键值对传参,那就需要==**有名分组**==  语法格式为`?P<year>`
      re_path(r"^case3/(?P<year>[0-9]{4,})/(?P<mon>[0-9]{2})/$",case03)
      path("^case3$/<int:year>/<int:month>")
    
      # 当我们考虑到路由路径可能会存在更改,但是又想后期让这个路径可以自己动态更新,不手动去改,那么我们就赋予一个name参数,用来反向解析用.通过这个name的值指向这条url的路径
      re_path(r"^case3/(?P<year>[0-9]{4,})/(?P<mon>[0-9]{2})/$",case03,name="myurl")
    
      #当反向解析的问题解决了,那么一个项目多个应用中可能存在name参数重复的问题,因此我们又需要命名空间这个东西.
      #规则如下↓↓↓
    

    视图响应

    def zongjie(request):
    
        return HttpResponse("总结测试") # HttpResponse是返回字符串
        return render(request,"test.html") # render 方法本质还是调用 HttpResponse返回字符串,只不过在之前会通过模板语法对一些数据显示进行替换.
    

    视图请求

    def zongjie(request):
        print(request.method) #request.method 获取请求方式,根据不同方式又可以提取不同的内容
        #http://127.0.0.1:8000/my_app/zongjie/?a=1&b=2,
        # request.GET= <QueryDict: {'a': ['1'], 'b': ['2']}>
        # request.GET.get("a") = 1
        print(request.GET,request.GET.get("a"))
        print(request.POST)
        #request常用方法 get_full_path() 和is_ajax
        #重点看下path和get_full_path()的区别,以URL=http://127.0.0.1:8000/my_app/zongjie/?a=1&b=2 为例
        print(request.path) #结果为 /my_app/zongjie/
        print(request.get_full_path())  #结果为/my_app/zongjie/?a=1&b=2
        print(request.is_ajax())  # False
    
        return HttpResponse("总结测试")
    

    模板语法

    模板语法一共两种

    1. {{data}} 这种是渲染变量,这里又有2个知识点,分别是深度查询和过滤器
    • 深度查询是 指的是对上面部分数据内再次查询的操作,比如字典,列表,类等,深度查询都是用.完成的

    • 常用的内置过滤器,主要是用在网页上的模板语法,用来过滤显示的数据的,语法:{{obj|filter_name:param}}
    1. {% %} 这种渲染标签用
    • for 循环的标签语法

    • if 逻辑判断标签语法
      和for一样 以{%if %}开头 {%endif%}结尾

    • with 标签语法,用来给添加变量指定特点较长的数据的

    • csrf_token 标签语法

    1. 自定义过滤器和自定义标签
      a. 在setting中的INSTALLED_APPS配置当前app,不然框架找不到自定义的simple_tag
      b. 在app中创建一个templatetags的模块(packages,不是文件夹)(模块名字不允许自定义)
      c. 创建任意py文件,例如我们创建的是define_tags.py

      d. 导包from django import template 并且创建实例 register=template.Libarary()
      e. 自定义的过滤器用 @register.filter,自定义的标签用@register.simple_tag

      f. 使用前导入自定义的过滤器py文件 {% load define_tags%}

    2. 模板语法小练习
      我们要做的功能大致如下,做一个模板base.html展示黑色部分的框架,再做一个family.html去继承base.html,然后展示里面的家人信息

      如果要继承模板,有2种模式extend和include,但是都要在首行输入
      {%include "base.html"%}或者{%extends "base.html"%} 区别:include会把所有的html代码全部导入,
      而extend在模板中会设置block标签,然后block标签以外的会引入进来,block标签就是自定义更改模板的地方

    {%block con%}  # 语法{%block 变量%}
    {%endblock con%} #endblock 后面也建议加入变量,代码阅读会方便,知道一整块属于那个block
    

    练习的代码截图如下:

    • urls和views代码

    • base.html代码如下

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>关系图</title>
        <link rel="stylesheet" href="/static/my_app/base.css">
    </head>
    <body>
        <div id="top">
    
        </div>
        <div id="body">
            <div id="left">
                <div class="function">
                    <p>功能分布</p>
    
    
                </div>
                <div id="checkret">
    <!--                这里添加功能查询-->
    
                    {% block function_check %}
    
                        <p>功能查询</p>
                    {% endblock %}
                </div>
    
            </div>
            <div id="right">
                <div id="check_title">
                    <p>查询框</p>
                </div>
                <div id="check_result">
                    <p>查询结果</p>
                    <div id="show_check_result">
                        <div id="topshow">
                            <ul>
                                <li>姓名</li>
                                <li>性别</li>
                                <li>年纪</li>
                            </ul>
    
                        </div>
                        <div id="bodyshow">
    <!--                        这里添加查询结果-->
                        <p>功能查询</p>
                            {% block relationship %}
    
    
    {#                        <ul>#}
    {#                            <li>姓名</li>#}
    {#                            <li>性别</li>#}
    {#                            <li>年纪</li>#}
    {#                        </ul>#}
    {#                        <ul>#}
    {#                            <li>姓名</li>#}
    {#                            <li>性别</li>#}
    {#                            <li>年纪</li>#}
    {#                        </ul>#}
                            {% endblock relationship%}
                        </div>
    
                    </div>
                </div>
    
            </div>
        </div>
    </body>
    </html>
    
    • base.html和family.html的导入和block对应图

    • 效果图

    正常情况下base.html模板中显示的内容会被family.html自定义的block内容给覆盖,但是如果想保留模板的block区域的内容,又想添加family的自定义内容
    那么就在family.html自定义模块中添加{{block.super}}

    {%block con%}
    {{block.super}}  
    
    {%endblock con%}
    
    • family.html添加{{block.super}}的示例图

      效果图如下
  • 相关阅读:
    关于celery踩坑
    关于git的分批提交pull requests流程
    SymGAN—Exploiting Images for Video Recognition: Heterogeneous Feature Augmentation via Symmetric Adversarial Learning学习笔记
    AFN—Larger Norm More Transferable: An Adaptive Feature Norm Approach for Unsupervised Domain Adaptation学习笔记
    Learning to Transfer Examples for Partial Domain Adaptation学习笔记
    Partial Adversarial Domain Adaptation学习笔记
    Partial Transfer Learning with Selective Adversarial Networks学习笔记
    Importance Weighted Adversarial Nets for Partial Domain Adaptation学习笔记
    Exploiting Images for Video Recognition with Hierarchical Generative Adversarial Networks学习笔记
    improved open set domain adaptation with backpropagation 学习笔记
  • 原文地址:https://www.cnblogs.com/Young-shi/p/15085527.html
Copyright © 2011-2022 走看看