zoukankan      html  css  js  c++  java
  • Django--视图函数

    Django--视图中的request常用功能

    request

    request.path -- 纯路径 /home/
    request.path_info -- 纯路径 /home/
    request.get_full_path() -- 全路径 不包括ip地址和端口 /home/?a=1&b=2
    request.META -- 请求头相关数据,是一个字典
    request.method -- 请求方法
    request.GET -- GET请求的信息
    request.POST -- POST发送的信息
    request.body -- 发送的数据

    HTTPResponse对象

    HTTPResponse("字符串")
    render(request, 'xx.html')
    redirect 重定向(302临时重定向) #用法 redirect(路径) 示例:redirect('/index/')

    FBV和CBV(基于1.11.9,2.0不是url,而是path

    FBV 函数视图
    url(r'^test/', views.test),
    path(r'test/', views.test),

    CBV 类视图
    url(r'^test1/', views.LoginView.as_view()),
    path(r'test1/', views.LoginView.as_view()),
    类视图中不需要确认请求方法是哪种,只需要写上相对应请求方法的方法就可以

    from django.views import View
    class LoginView(View):
        def get(self, request):
            print("get")
            return render(request, 'test.html')
        
        def post(self, request):
            return HttpResponse('test')
    

    关于其中的原理,就是父类里面的as_view()方法,主要的函数的dispatch(),运用的是反射的方法,返回一个设置好的函数,最后返回的return handler(request, *args, kwargs)就相当于views视图里面的return render(request, 'test.html')**
    在这里插入图片描述在这里插入图片描述

    CBV加装饰器

    首先需要在视图中引入一个模块
    from django.utils.decorators import method_decorator
    接下来只需要在需要装饰的方法上面添加method_decorator(wrapper)即可

    模板渲染

    {{ 变量 }} 和 {% 逻辑 %} 跟flask差不多
    html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta name="viewport" content="width=device-width,initial-scale=1.0" charset="utf-8"/>
        <title>Title</title>
        <style>
    
        </style>
    </head>
    <body>
        <h1>test</h1>
        <h2>{{ obj.name }}</h2>
        <h2>{{ dic.alex }}</h2>
        <h2>{{ obj.func }}</h2>
        <h2>{{ li.2 }}</h2>
    </body>
    <script>
    
    </script>
    </html>
    

    views视图

    def test(request):
        li = [1,2,3,4,5]
        dic = {'alex':18,'wusir':22}
        class Person():
            name = 'admin'
            def func(self):
                return ('alex是个大烧饼')
        obj = Person()
        print(request.META['REMOTE_ADDR'])
        return render(request, 'test.html',{'li':li,'dic':dic, 'obj':obj})
    
    

    过滤器
    过滤器的语法: {{ value|filter_name:参数 }}
    使用管道符"|"来应用过滤器。
    例如:{{ name|lower }}会将name变量应用lower过滤器之后再显示它的值。lower在这里的作用是将文本全都变成小写。
    注意事项:
    过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
    过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
    过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:', ' }}
    '|'左右没有空格没有空格没有空格
    Django的模板语言中提供了大约六十个内置过滤器。

    default
    如果一个变量是false或者为空,使用给定的默认值。 否则,使用变量的值。
    {{ value|default:"nothing"}}
    如果value没有传值或者值为空的话就显示nothing

    length
    返回值的长度,作用于字符串和列表。
    {{ value|length }}
    返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.

    filesizeformat
    将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:
    {{ value|filesizeformat }}
    如果 value 是 123456789,输出将会是 117.7 MB。

    slice
    切片,如果 value="hello world",还有其他可切片的数据类型
    {{value|slice:"2:-1"}}

    date
    格式化,如果 value=datetime.datetime.now()
    {{ value|date:"Y-m-d H:i:s"}}
    关于时间日期的可用的参数(除了Y,m,d等等)还有很多,有兴趣的可以去查查看看。

    safe
    Django的模板中在进行模板渲染的时候会对HTML标签和JS等语法标签进行自动转义,有时候我们不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。
    {{ value|safe}}

    truncatechars
    如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
    参数:截断的字符数

    **{{ value|truncatechars:9}}** 
    # 注意:最后那三个省略号也是9个字符里面的,
    # 也就是这个9截断出来的是6个字符+3个省略号
    

    truncatewords
    在一定数量的字后截断字符串,是截多少个单词。
    例如:‘hello girl hi baby yue ma’,
    {{ value|truncatewords:3}} #上面例子得到的结果是 'hello girl h1...'

    cut
    移除value中所有的与给出的变量相同的字符串
    {{ value|cut:' ' }}
    如果value为'i love you',那么将输出'iloveyou'.

    join **
    使用字符串连接列表,
    {{ list|join:', ' }}**,就像Python的str.join(list)

    timesince
    将日期格式设为自该日期起的时间(例如,“4天,6小时”)。
    采用一个可选参数,它是一个包含用作比较点的日期的变量(不带参数,比较点为现在)。 例如,如果blog_date是表示2006年6月1日午夜的日期实例,并且comment_date是2006年6月1日08:00的日期实例,则以下将返回“8小时”:
    {{ blog_date|timesince:comment_date }}
    分钟是所使用的最小单位,对于相对于比较点的未来的任何日期,将返回“0分钟”。

    timeuntil
    似于timesince,除了它测量从现在开始直到给定日期或日期时间的时间。 例如,如果今天是2006年6月1日,而conference_date是保留2006年6月29日的日期实例,则{{ conference_date | timeuntil }}将返回“4周”。
    使用可选参数,它是一个包含用作比较点的日期(而不是现在)的变量。 如果from_date包含2006年6月22日,则以下内容将返回“1周”:
    {{ conference_date|timeuntil:from_date }}

    标签
    for循环标签

     循环列表等
    {% for person in person_list %}
        <p>{{ person.name }}</p>  <!--凡是变量都要用两个大括号括起来-->
    {% endfor %}
    循环字典
    {% for key,val in dic.items %}
        <p>{{ key }}:{{ val }}</p>
    {% endfor %}
    
    empty
    {% for person in person_list %}
        <p>{{ person.name }}</p>  <!--凡是变量都要用两个大括号括起来-->
    {% empty %}
    	<p>没有找到东西!</p>
    {% endfor %}
    
    
    forloop.counter            当前循环的索引值(从1开始),forloop是循环器,通过点来使用功能
    forloop.counter0           当前循环的索引值(从0开始)
    forloop.revcounter         当前循环的倒序索引值(从1开始)
    forloop.revcounter0        当前循环的倒序索引值(从0开始)
    forloop.first              当前循环是不是第一次循环(布尔值)
    forloop.last               当前循环是不是最后一次循环(布尔值)
    forloop.parentloop         本层循环的外层循环的对象,再通过上面的几个属性来显示外层循环的计数等
    示例:
    	{% for i in d2 %}
            {% for k,v in d1.items %}
    
                <li>{{ forloop.counter }}-- {{ forloop.parentloop.counter }} === {{ k }} -- {{ v }}</li>
    
            {% endfor %}
    
        {% endfor %}
    

    if判断标签

    {% if num > 100 or num < 0 %}
        <p>无效</p>  <!--不满足条件,不会生成这个标签-->
    {% elif num > 80 and num < 100 %}
        <p>优秀</p>
    {% else %}  <!--也是在if标签结构里面的-->
        <p>凑活吧</p>
    {% endif %}
    
    if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断,注意条件两边都有空格。
    

    with

    方法1
    {% with total=business.employees.count %}  #注意等号两边不能有空格
        {{ total }} <!--只能在with语句体内用-->
    {% endwith %}
    方法2
    {% with business.employees.count as total %}
        {{ total }}
    {% endwith %}
    
  • 相关阅读:
    非root用户加入docker用户组省去sudo
    walle2.0 nginx.conf配置文件参数
    CentOS7.6 yum方式安装mysql2.7.25
    云服务器Ubuntu 14.04.2和centos7.5实现nfs挂载
    fs.inotify.max_user_watches默认值太小,导致too many open files
    CentOS7.X首次安装docker无法启动的问题解决
    【转载】Linux启动初始化配置文件浅析(解决source /etc/profile重启后就失效?)
    Apache:SSLCertificateFile:文件不存在或为空(操作系统RHEL7)
    20181023红帽学习笔记
    Undefined symbols for architecture x86_64:
  • 原文地址:https://www.cnblogs.com/alex3174/p/11592539.html
Copyright © 2011-2022 走看看