3.Django|视图层||模板层

1、视图函数

  一个视图函数简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以。无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你的Python目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名为views.py的文件中。

视图层,熟练掌握两个对象即可:请求对象(request)和响应对象(HttpResponse)

视图层之请求对象

http://127.0.0.1:8000/index/?name=kris&age=18
url:协议://IP:port//路径?get请求数据

属性

view_demo/urls

from django.contrib import admin
from django.urls import path, re_path

from app01 import views
urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r"index/", views.index), #index(request)
    re_path(r"^$", views.index)  #跟上边对应的视图函数一样,可以直接ip+端口访问,不需路径
]

views

from django.shortcuts import render

# Create your views here.

from django.shortcuts import HttpResponse
def index(request):
    print("method", request.method) #告诉你这是次GET请求
    print(request.GET)
    #print(request.GET("name"))
    print(request.POST)

    print(request.path)  #只能拿到路径
    print(request.get_full_path()) #既可以拿到数据,又可以拿到路径

    return render(request, "index.html")

index

扫描二维码关注公众号,回复: 1288222 查看本文章
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="" method="post">  {#action里边可以加http://127.0.0.1:8000/index/也可以加index/都是默认会生成#}
        姓名<input type="text" name="name">
        年龄<input type="text" name="age">
        <input type="submit">
    </form>
</body>
</html>
method GET
<QueryDict: {'a': ['1']}>
<QueryDict: {}>
/index/
/index/?a=1
[26/May/2018 15:16:08] "GET /index/?a=1 HTTP/1.1" 200 292

方法

视图响应对象

views

from django.shortcuts import render

# Create your views here.

from django.shortcuts import HttpResponse
def index(request):
    print("method", request.method) #告诉你这是次GET请求
    print(request.GET)
    #print(request.GET("name"))
    print(request.POST)

    print(request.path)  #只能拿到路径
    print(request.get_full_path()) #既可以拿到数据,又可以拿到路径

    #return HttpResponse("<h1>ok</h1>") #返回一个字符串
    import time
    ctime = time.time()


    return render(request, "index.html",{"timer":ctime}) #index.html是模板文件
#render渲染的时候把模板文件按照模板语法进行渲染成一个html文件发给浏览器
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="" method="post">  {#action里边可以加http://127.0.0.1:8000/index/也可以加index/都是默认会生成#}
        姓名<input type="text" name="name">
        年龄<input type="text" name="age">
        <input type="submit">
    </form>
<p>{{ timer }}</p>  {#模板语法,模板文件#}
</body>
</html>

 2、模板语言

变量

views.py

from django.shortcuts import render

# Create your views here.

def index(request):
    '''模板语法:
    变量:{{}} 1.深度查询 句点符;2.过滤器
    标签:{% %}
    :param request:
    :return:
    '''
    name = "kris"
    i = 10
    l = [1,2,3]
    info = {"name":"kris", "age":22}
    b = True
    class Person(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age
    alex = Person("alex",33)
    egon = Person("egon",38)

    person_list = [alex, egon]

    #return render(request, "index.html", {"name":name})
    return render(request, "index.html", locals()) #locals是局部变量的意思,这样就不用一个个去对应了

index.py

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>index</h1>
    <p>{{ name }}</p>
    <p>{{ i }}</p>
    <p>{{ info }}</p>
    <p>{{ l }}</p>
    <p>{{ alex }}</p>
    <p>{{ person_list }}</p>
    <p>{{ b }}</p>
    <hr>
    深度查询
    <p>{{ l.1 }}</p>
    <p>{{ info.name }}</p>
    <p>{{ alex.age }}</p>
    <p>{{ person_list.1.age }}</p>

</body>
</html>

过滤器

views

from django.shortcuts import render

# Create your views here.

def index(request):
    '''模板语法:
    变量:{{}} 1.深度查询 句点符;2.过滤器
    标签:{% %}
    :param request:
    :return:
    '''
    ##########过滤器
    import datetime
    now = datetime.datetime.now()

    file_size = 123456789

    text = "hello python hi luffycity go java linux"
    link = "<a href=''>click</a>"

    #return render(request, "index.html", {"name":name})
    return render(request, "index.html", locals()) #locals是局部变量的意思
   <h3>过滤器</h3>
    <p>{{ now|date:"Y-m-d" }}</p>
    <p>{{ person_list|default:"数据为空" }}</p>
    <p>{{ file_size|filesizeformat }}</p>
    <p>{{ text|truncatechars:9 }}</p>  {# 按照字节数#}
    <p>{{ text|truncatewords:3 }}</p> {# 按照单词数#}
    <p>{{ link|safe }}</p> {# 不加safe,django为了安全性会把含有特殊字符的符号转义#}
    <p>{{ l.0|add:100 }}</p> {# 1+100=101#}
    <p>{{ info.name|upper }}</p>

标签

views

from django.shortcuts import render, HttpResponse

# Create your views here.

def index(request):
    '''模板语法:
    变量:{{}} 1.深度查询 句点符;2.过滤器 {{val|filter_name}}
    标签:{% %}
    :param request:
    :return:
    '''

    #########标签
    user = "alex"
    #return render(request, "index.html", {"name":name})
    return render(request, "index.html", locals()) #locals是局部变量的意思

def login(request):
    if request.method == "POST":
        return HttpResponse("OK")

    return render(request, "login.html")

index

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    
    <h4>for标签</h4>
    {% for i in l%}
    <p>{{ i }}</p>
    {% endfor %}

    {% for i in info %}
    <p>{{ i }}</p>
    {% endfor %}

    {% for person in person_list %}
    <p>{{ forloop.counter0 }} {{ person.name }} , {{ person.age }}</p>
        {% empty %}
        <p>列表为空</p>
    {% endfor %}


    {% if user %}
    <p>
       <a href="">hi {{ user }}</a>  {# user变量有值就是登录状态,要渲染的标签   #}
        <a href="">注销</a>
    </p>
    {% else %}
        <p>
            <a href="">登录</a>
            <a href="">注册</a>
        </p>
    {% endif %}

    {% with person_list.1.name as n %}  {#进行替换#}
    {{ n }}
    {{ n }}
    {% endwith %}


</body>
</html>

login

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="" method="post">
      {% csrf_token %}  {# 第一次发post请求,知道你没这个键值对就可以把你拦截了,一刷新这个页面就有了,#}
{#        再提交时第二次给服务器发post请求,带着这个键值就可以通过;这个值是存储在服务器上的,专门给你拦截#}
        <input type="text" name="user">
        <input type="submit">
    </form>
</body>
</html>

   

自定义标签

在my_tag_filter

from django import template

register = template.Library()
@register.filter
def multi_fliter(x, y):
    return x*y

@register.simple_tag()
def multi_tag(x, y, z):
    return x*y*z

index里边的部分

   <h4>自定义过滤器,标签</h4>
   {% load my_tag_filter %}   {# 把你写的文件导入进来#}
    <p>{{ i|multi_fliter:20 }}</p> {# i*20 ;调用的时候最多传2个参数这就是multi_fliter的局限性#}

    <p>{% multi_tag 7 9 2%}</p>  {# 自定义一个标签,标签的调用 ;自定义标签没有限制,虽然参数灵活了,但是不能放在if里边进行条件判断,因为它需要加%#}

    {% if i|multi_fliter:10 > 100 %}
    <p>100</p>
        {% else %}
        <p>{{ i }}</p>
    {% endif %}

 继承

模板bases

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">

    {% block title %} {#留下盒子,等继承者去继承;你写个title,继承者想继承就继承,不想继承就按照父本这样子 #}
    <title>base</title>
    {% endblock %}

    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <style>
        *{
            margin:0;
            padding: 0;
        }
        .header{
            width:100%;
            height: 50px;
            background-color: #369;
        }

    </style>
</head>
<body>
<div class="header"></div>
<div class="container">
    <div class="row">
        <div class="col-md-3">
            {% include 'advertise.html' %}
        </div>
        <div class="col-md-9">
            {% block con %}
                <h1>content</h1>
            {% endblock %}
        </div>
    </div>
</div>

</body>
</html>

index

{% extends 'base.html' %} {#先继承base,必须写在首行,不然它不知道block是什么意思 #}

{% block title %}
<title>index</title>
{% endblock %}

{% block con %}   {#base里边col-md-9里边没有内容,它只留了一个盒子 #}
            <h1>index</h1>
            <p>{{ name }}</p>
            <p>{{ i }}</p>
            <p>{{ info }}</p>
            <p>{{ l }}</p>
            <p>{{ alex }}</p>
            <p>{{ person_list }}</p>
            <p>{{ b }}</p>
            <hr>
            深度查询
            <p>{{ l.1 }}</p>
            <p>{{ info.name }}</p>
            <p>{{ alex.age }}</p>
            <p>{{ person_list.1.age }}</p>

            <h3>过滤器</h3>
            <p>{{ now|date:"Y-m-d" }}</p>
            <p>{{ person_list|default:"数据为空" }}</p>
            <p>{{ file_size|filesizeformat }}</p>
            <p>{{ text|truncatechars:9 }}</p>  {# 按照字节数#}
            <p>{{ text|truncatewords:3 }}</p> {# 按照单词数#}
            <p>{{ link|safe }}</p> {# 不加safe,django为了安全性会把含有特殊字符的符号转义#}
            <p>{{ l.0|add:100 }}</p> {# 1+100=101#}
            <p>{{ info.name|upper }}</p>
            <hr>

            <h4>for标签</h4>
            {% for i in l%}
            <p>{{ i }}</p>
            {% endfor %}

            {% for i in info %}
            <p>{{ i }}</p>
            {% endfor %}

            {% for person in person_list %}
            <p>{{ forloop.counter0 }} {{ person.name }} , {{ person.age }}</p>
                {% empty %}
                <p>列表为空</p>
            {% endfor %}


            {% if user %}
            <p>
               <a href="">hi {{ user }}</a>  {# user变量有值就是登录状态,要渲染的标签#}
                <a href="">注销</a>
            </p>
            {% else %}
                <p>
                    <a href="">登录</a>
                    <a href="">注册</a>
                </p>
            {% endif %}

            {% with person_list.1.name as n %}  {#进行替换#}
            {{ n }}
            {{ n }}
            {% endwith %}

            <hr>
            <h4>自定义过滤器,标签</h4>
           {% load my_tag_filter %}   {# 把你写的文件导入进来#}
            <p>{{ i|multi_fliter:20 }}</p> {# i*20 ;调用的时候最多传2个参数这就是multi_fliter的局限性#}

            <p>{% multi_tag 7 9 2%}</p>  {# 自定义一个标签,标签的调用 ;自定义标签没有限制,虽然参数灵活了,但是不能放在if里边进行条件判断,因为它需要加%#}

            {% if i|multi_fliter:10 > 100 %}
            <p>100</p>
                {% else %}
                <p>{{ i }}</p>
            {% endif %}
{% endblock %}

order

{% extends 'base.html' %}

{% block title %}
<title>orders</title>
{% endblock %}

{% block con %}
{{ block.super}} {#这样就继承了父类,又重写了自己#}
<h4>订单</h4>
{% endblock con%} {#可以把名字加上就好区分了,谁对应谁 #}

猜你喜欢

转载自www.cnblogs.com/shengyang17/p/9093078.html