Django-views视图函数-template模板语法

视图函数

经常使用的http请求有两种,一种是get,一种是posthtml

在django的views.py中,咱们处理客户端的请求:python

咱们定义url映射过来的视图函数,接受请求参数request(请求对象)数据库

def login(request):
    if request.method=="POST":
        print("GET",request.GET)#根据不一样的请求方式,咱们可使用不一样的request的方法进行取值
        print("POST",request.POST)#request.POST 获取的是一个字典,经过get(key)获取对应的值
        user=request.POST.get("user")
        pwd=request.POST.get("pwd")
        
        return HttpResponse("登录成功!")
    
    return render(request,"login.html")

对于表单中的复选框checkbox、多选select 的请求的取值方式django

request.POST查看下获取的字典安全

request.POST.getlist(“hobby”)获取字典中多个值cookie

一些经常使用语法

其余使用方式
             request(请求对象):
                request.GET       {}     get请求数据
                request.POST      {}     post请求数据
                request.POST.getlist()
                request.method           请求方式,用于判断
                request.path             请求路径用于获取
                request.get_full_path()  请求全路径

HTTPrequest的对象

属性session

'''
path:       请求页面的全路径,不包括域名

method:     请求中使用的HTTP方法的字符串表示。全大写表示。例如

               if  req.method=="GET":

                         do_something()

               elif req.method=="POST":

                         do_something_else()

GET:         包含全部HTTP GET参数的类字典对象

POST:       包含全部HTTP POST参数的类字典对象

COOKIES:     包含全部cookies的标准Python字典对象;keys和values都是字符串。

FILES:      包含全部上传文件的类字典对象;FILES中的每个Key都是<input type="file" name="" />标签中
             name属性的值,FILES中的每个value同时也是一个标准的python字典对象,包含下面三个Keys:

             filename:      上传文件名,用字符串表示
             content_type:   上传文件的Content Type
             content:       上传文件的原始内容


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

session:    惟一可读写的属性,表明当前会话的字典对象;本身有激活Django中的session支持时该属性才可用。

'''

 

response( 响应对象)

  •   HttpRequose()用于返回简单的字符串
  •   render函数()返回模板
  •   redirect函数()路径的重定向

render函数

render(request, template_name[, context]) 

结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
参数:
     request: 用于生成响应的请求对象。

     template_name:要使用的模板的完整名称,可选的参数

     context:添加到模板上下文的一个字典。默认是一个空字典。若是字典中的某个值是可调用的,视图将在渲染模板以前调用它。

     content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。

     status:响应的状态码。默认为200。

render实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>


<h3>{{ l }}</h3>
<h3>{{ d }}</h3>
<h3>{{ s }}</h3>

<hr>
/* 模板中的循环方式*/
{% for i in PersionList %} <p>{{ i.age }},{{ i.name }}</p> {% endfor %} </body> </html>

 

#views.py
def index(request):
    s ="Wate"
    age = 18
    l = ["23","2333","3333"]
    d = {"hello":"wate","hello1":"haoms"}

    class Persion:
        def __init__(self,name,age):
            self.name=name
            self.age = age

        def dream(self):
            return "have dream"
    egon = Persion("egon",28)
    wate = Persion("wate",18)
    alex = Persion("alex",28)
    PersionList=[egon,wate,alex]
#下面render会将模板中的变量,对应context参数中的字典对应的值传入模板中,可传入整形,字符串,列表,字典,类
return render(request,"app01/index.html",{"s":s,"age":age,"l":l,"d":d,"PersionList":PersionList})

 

redirect函数

参数能够是:
◾一个模型:将调用模型的get_absolute_url() 函数
◾一个视图,能够带有参数:将使用urlresolvers.reverse 来反向解析名称
◾一个绝对的或相对的URL,将原封不动的做为重定向的位置。

默认返回一个临时的重定向;传递permanent=True 能够返回一个永久的重定向。

示例:


你能够用多种方式使用redirect() 函数。

 

模板层

tempalte(模板层):
        
        功能: 为了更有逻辑的将数据库中的数据渲染到模板中
        
        模板语法     
              变量  {{ }}
            
                   深度查询: 句点符 .
                   过滤器: {{var|filter_name:参数}}   
                   
            标签  {% url %}  
                
                {% for i in obj %}    {% endfor %}        
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

/*变量*/
<h3>{{ l }}</h3>
<h3>{{ d }}</h3>
<h3>{{ s }}</h3>

<hr>
/*循环,类对象*/
{% for i in PersionList %} <p>{{ i.age }},{{ i.name }}</p> {% endfor %} </body> </html>

 

{% if %} 的使用

{% if num >= 100 and 8 %}

    {% if num > 200 %}
        <p>num大于200</p>
    {% else %}
        <p>num大于100小于200</p>
    {% endif %}

{% elif num < 100%}
    <p>num小于100</p>

{% else %}
    <p>num等于100</p>

{% endif %}



{% if %} 标签接受and,or或者not来测试多个变量值或者否认一个给定的变量
{% if %} 标签不容许同一标签里同时出现and和or,不然逻辑容易产生歧义,例以下面的标签是不合法的:

{% if obj1 and obj2 or obj3 %}

 

csrf_token标签

用于生成csrf_token的标签,用于防治跨站攻击验证。 其实,这里是会生成一个input标签(标识身份),和其余表单标签一块儿提交给后台的。app

当咱们post请求时会出现403报错,是因为django的安全机制致使。函数

咱们注释掉setting中的post

#'django.middleware.csrf.CsrfViewMiddleware',
就是为了这个安全机制失效。
如今有了另外一种方式
咱们在post请求表单中添加{% csrf_token %}

 

 

模板语法变量过滤器

模板的过滤器就是模板中对变量进一步的作处理~

好比上面的例子,咱们须要在模板中对年龄增长10岁

就能够写成

在模板中对整型变量进行加操做
<h3> helllo {{ name }}--{{ age|add:10 }}</h3>

对日期变量进行格式化
<p>{{ date|date:"Y-m-d" }}</p>

default过滤器,当变量为空时,设置默认值
<p>{{ l|default:"空变量" }}</p>

length过滤器,显示有多少个元素
<p>{{ s|length }}</p>

filesizeformat过滤器
将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:
{{ 12312321|format }}

切片过滤器,顾头不顾尾,从第二个字符取到倒数第二个
{{ name|slice:"2:-1" }}

truncatechars过滤器,只显示变量的9个字符以后跟省略号
{{ value|truncatechars:9 }}
{{ value|truncatewords:9 }}
safe
Django的模板中会对HTML标签和JS等语法标签进行自动转义,缘由显而易见,这样是为了安全。
可是有的时候咱们可能不但愿这些HTML元素被转义,好比咱们作一个内容管理系统,
后台添加的文章中是通过修饰的,这些修饰多是经过一个相似于FCKeditor编辑加注了HTML修饰符的文本,
若是自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,
若是是一个单独的变量咱们能够经过过滤器“|safe”的方式告诉Django这段代码是安全的没必要转义。好比:
当变量为标签时 好比变量a_ele为: <a href=''>点击</a>
{{ a_ele|safa }}这种声明为安全的标签,原生

 

自定义标签和过滤器

一、在settings中的INSTALLED_APPS配置当前app,否则django没法找到自定义的simple_tag.

二、在app中建立templatetags包(包名只能是templatetags)

三、建立任意 .py 文件,如:my_tags.py

 

from django import template
from django.utils.safestring import mark_safe
register = template.Library()   #register的名字是固定的,不可改变
#前三行固定

四、写功能脚本

#须要使用register.filter装饰器
@register.filter
#注意模板中只能接受两个参数
def multi(x,y): return x*y

五、引入脚本(在html中使用功能的地方添加上)

{% load my_tags %} 
{{ n|multi:12 }}

使用方式,除了直接使用以外,还能够用做模板中的判断语句,和if一块儿用

#只有过滤器能够用,标签不能够
{% if n|multi:10 > 100 %}
<p>大与100</p>
{% else %}
<p>小于等于100</p>
{% endif %}

 

注意,新引入的过滤器须要重启项目

自定义标签

除了自定义过滤器以外,还有个类似的自定义标签,与过滤器不一样的地方在于

脚本中引用的装饰器不一样

咱们在mytag.py中写入

@register.simple_tag #标签
def multi(x,y):
#可接受任意个参数
return x*y

在html中引入方式

{% load my_tags %} 
{% multi_tag n 5 %}

filter和标签 区别:

  一、自定义filter只能接受两个参数

  二、自定义simple_tag不能与if使用

 

模板的继承

一、建立母版

在须要替换的地方添加个盒子

引用时

一、继承时extends必须是第一个标签

二、追加时使用{{ block.super }}

  • 为了更好的可读性,你也能够给你的 {% endblock %} 标签一个 名字 。例如:

{% block content %}
...
{% endblock content %}

在大型模版中,这个方法帮你清楚的看到哪个  {% block %} 标签被关闭了。

相关文章
相关标签/搜索