zoukankan      html  css  js  c++  java
  • Python学习第122天(Django回头看:视图函数、redirect、模板变量、过滤器)

    看来前段时间看的内容还是得再花一天才能复习完啊(此时更加对昨天的集体学习耿耿于怀)

    今天重新复习了一下如题目所列的内容,下面来逐个说一下。

    (1)视图函数

      说这个东西其实基本是一个概念性的东西,主要说了一下视图函数涉及到的主要的两个方面

      http请求:HttpRequest对象

      http响应:HttpResponse对象

      一、先说一下HttpRequest对象的一些属性,也就是我们在views的函数中的必写参数req的属性

      path:请求页面的全路径,不包括域名  req.path得到目前的路径

      get_full_path:可获得全部路劲,同时也可携带数据,比如:http://127.0.0.1:8000/index33/?name=123 ,req.get_full_path()得到的结果就是/index33/?name=123

      method:请求中使用的HTTP方法的字符串表示。全大写表示。这个之前是使用过的,比如之前我们进行的一些判断语句if req.method=="GET":

      user:这个视频里面没有讲,但是自己有看到,就一并记录吧

           是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。可以通过user的is_authenticated()方法来辨别用户是否登陆:if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware时该属性才可用

      二、HttpResponse对象,直白点就是我们返回的经过渲染之后的html文件

      三种方式:

        1.页面渲染:render()(推荐)<br>                 render_to_response()

          render(req,“html文件”,{“html文件中的变量名” : 函数中变量名})

          render_to_response:和上面这个相比就是不用写req,虽然砍死少了几个字母,但是不推荐使用

        2.页面跳转:redirect(“路径”)  跳转

          常用于,注册完成后直接跳转到登录界面,这里跳转后,相应的url也会随之变化,刷新了也不会回去。

        3.locals():可以直接将函数中所有的变量传给模板

          就是刚才上面render中的{“html文件中的变量名” : 函数中变量名},很明显,如果html文件中只有一个变量或少数几个进行渲染,用大括号这样写当然没问题,但是如果多了一一对应就比较难写,这个时候就可以使用locals()来进行取代。

        总结: render和redirect的区别:

           1 if render的页面需要模板语言渲染,需要的将数据库的数据加载到html,那么所有的这一部分除了写在yuan_back的视图函数中,必须还要写在login中,代码重复,没有解耦。

           2 the most important: url没有跳转到/yuan_back/,而是还在/login/,所以当刷新后又得重新登录。

    二、模板引入(变量和筛过滤器)

      先说一下为什么需要引入模板    

    def current_time(req):
        原始的视图函数
        now=datetime.datetime.now()
        html="<html><body>现在时刻:<h1>%s.</h1></body></html>" %now
        return HttpResponse(html)

      如果没有模板,我们每个变量都需要通过上面这种方式来实现,那么前端和后端的开发就没办法实现解耦了

      所以此时我们就需要引入Template和Context对象

        template就是模板,context是上下文内容,我们通过将context中内容渲染到template中实现最终反馈到前端的html文件

        然后template中的{ {  } }就是模板的标识,是Django为我们提供的语法。

      通过导入from django.template.loader import get_template

      从而进行如下的操作:

    def current_time(req):
          #django模板修改的视图函数
         now=datetime.datetime.now()
         t=Template('<html><body>现在时刻是:<h1 style="color:red">{{current_date}}</h1></body></html>')
         #t=get_template('current_datetime.html')
         c=Context({'current_date':now})
         html=t.render(c)
         return HttpResponse(html)

      或是:

    def current_time(req):
        now=datetime.datetime.now()
        return render(req, 'current_datetime.html', {'current_date':now})

      深度变量的查找(万能的句点号)

      内容比较简单,通过句点号获取列表、字典、自己创建的类里面的部分数据,就是用课件上的例子了

      

    # 首先,句点可用于访问列表索引,例如:
    
    >>> from django.template import Template, Context
    >>> t = Template('Item 2 is {{ items.2 }}.')
    >>> c = Context({'items': ['apples', 'bananas', 'carrots']})
    >>> t.render(c)
    'Item 2 is carrots.'
    
    #假设你要向模板传递一个 Python 字典。 要通过字典键访问该字典的值,可使用一个句点:
    >>> from django.template import Template, Context
    >>> person = {'name': 'Sally', 'age': '43'}
    >>> t = Template('{{ person.name }} is {{ person.age }} years old.')
    >>> c = Context({'person': person})
    >>> t.render(c)
    'Sally is 43 years old.'
    
    #同样,也可以通过句点来访问对象的属性。 比方说, Python 的 datetime.date 对象有
    #year 、 month 和 day 几个属性,你同样可以在模板中使用句点来访问这些属性:
    
    >>> from django.template import Template, Context
    >>> import datetime
    >>> d = datetime.date(1993, 5, 2)
    >>> d.year
    1993
    >>> d.month
    5
    >>> d.day
    2
    >>> t = Template('The month is {{ date.month }} and the year is {{ date.year }}.')
    >>> c = Context({'date': d})
    >>> t.render(c)
    'The month is 5 and the year is 1993.'
    
    # 这个例子使用了一个自定义的类,演示了通过实例变量加一点(dots)来访问它的属性,这个方法适
    # 用于任意的对象。
    >>> from django.template import Template, Context
    >>> class Person(object):
    ...     def __init__(self, first_name, last_name):
    ...         self.first_name, self.last_name = first_name, last_name
    >>> t = Template('Hello, {{ person.first_name }} {{ person.last_name }}.')
    >>> c = Context({'person': Person('John', 'Smith')})
    >>> t.render(c)
    'Hello, John Smith.'
    
    # 点语法也可以用来引用对象的方法。 例如,每个 Python 字符串都有 upper() 和 isdigit()
    # 方法,你在模板中可以使用同样的句点语法来调用它们:
    >>> from django.template import Template, Context
    >>> t = Template('{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}')
    >>> t.render(Context({'var': 'hello'}))
    'hello -- HELLO -- False'
    >>> t.render(Context({'var': '123'}))
    '123 -- 123 -- True'
    
    # 注意这里调用方法时并* 没有* 使用圆括号 而且也无法给该方法传递参数;你只能调用不需参数的
    # 方法。

    常见过滤器:

      语法格式{ { 对象|方法名:参数 } }

    1.add  给变量加上相应的值

    2.addslashes : 给变量中的引号前加上斜线

    3 capfirst : 首字母大写

    4.cut : 从字符串中移除指定的字符

    5.date : 格式化日期字符串

    6.default : 如果值是False,就替换成设置的默认值,否则就是用本来的值

    7. default_if_none: 如果值是None,就替换成设置的默认值,否则就使用本来的值

    以上是今天的全部复习内容。。。

  • 相关阅读:
    python设计模式之简单工厂
    python设计模式之观察者模式
    python设计模式之模版方法设计模式
    python设计模式之策略模式
    python编程之数据描述器
    python设计模式之单例模式
    .NET 开源工作流: Slickflow流程引擎高级开发(七)--消息队列(RabbitMQ)的集成使用
    .NET 开源工作流: Slickflow流程引擎快速入门之四:--SlickGraph 流程模型编码建模工具使用手册
    .NET 开源工作流: Slickflow流程引擎快速入门之三: 简单或分支流程代码编写示例
    .NET 开源工作流: Slickflow流程引擎快速入门之二: 简单并行分支流程代码编写示例
  • 原文地址:https://www.cnblogs.com/xiaoyaotx/p/13252490.html
Copyright © 2011-2022 走看看