python-django学习足迹(二)

Django views(视图函数)

处理请求

redirect()

return redirect(‘/login/’) 视图函数下条件判断后返回跳转到登录页面

# 引入redirect
from django.shortcuts import render,HttpResponse,redirect
import time


def regist(req):
    # 走POST请求
    if req.method == "POST":
        # 打印form表单提交的信息
        print(req.POST.get('user'))
        print(req.POST.get('age'))
        user = req.POST.get('user')
        if user == 'admin':
            return redirect('/login/')
        return HttpResponse('success!')

    return render(req, 'regist.html')

这里写图片描述

这里写图片描述





视图函数的locals()用法

urls.py


urlpatterns = [
    url(r'^show_time/', views.show_time),
]

index.html


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!--用的比较多的引用-->
    <!--此处没有引用页面无法显示-->
    {% load staticfiles %}

    <title>Title</title>
</head>
<body>
    <!-- name,t 均为视图函数show_time的局部变量-->
    <h1>Hello {{ name }} 时间:{{t}}  {{ req.method }}</h1>

</body>
</html>

views.py


def show_time(req):

    t = time.ctime()
    name= 'chs'
    # locals() 渲染视图函数的局部变量到html中
    return render(req, 'index.html',  locals())

视图函数内的render()

渲染函数
render(req, ‘login.html’) 渲染login.html页面

百度百科 视图渲染函数render() 与 视图跳转页面函数redirect()的区别

Template基础

模板系统的介绍

与前端交互的模板

(一)模板语言
组成: HTML代码 + 逻辑控制代码

(二)逻辑控制代码的组成
1 变量(使用大括号来引用变量)
语法格式: {{ var_name }}

在Terminal命令行输入命令: python manage.py shell 进入当前django项目的环境下
.
关于python 与 前端的交互,将后台变量渲染到页面
这里写图片描述

关于模板的变量

urls.py


from django.contrib import admin
from django.conf.urls import url

from app0 import views

urlpatterns = [
    url(r'^Query', views.Qurey),
]

index.html


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

    <h1>hello {{ action.0 }}</h1>
    <h1>hello {{ action.1 }}</h1>
    <h1>hello {{ d.name }}</h1>
    <h1>hello {{ d.age }}</h1>
    <h1>hello {{ d.hobby }}</h1>
    <h1>hello {{ c.name }}</h1>
    <h1>hello {{ c.sex }}</h1>

</body>
</html>


views.py


class Animal():
    def __init__(self, name, sex):
        self.name = name
        self.sex = sex


def Query(request):

    l = ['越今朝', '越祁', '云天河']
    d = {'name': '慕容紫英', 'age': 20, 'hobby': '123'}

    c = Animal('alex', '母')


    return render(request, 'index.html', {'action': l, 'd': d,
                                          'c': c,})
  # return render(request, 'index.html', locals())



这里写图片描述


关于模板的过滤器

变量的过滤器(filter)的使用
语法格式: {{ obj | filter : param }}

内置函数

1. add : 给变量加上相应的值
2. addslashes : 给变量中的引号前加上斜线
3.  capfirst : 首字母大写
4.  cut : 从字符串中移除指定的字符
5.  date : 格式化日期字符串
6.  default : 如果值是 False ,就替换成设置的默认值, 否则就是用本来的值
7.  default_if_none : 如果值是None, 就替换成设置的默认键,否则就使用本来的值

内置函数实例
views.py


def Query(request):

    t = datetime.datetime.now()
    test = 'hello python'
    num = 10
    test1 = 'hel   lo py th on'
    e = []
    a = '<a href="http://www.baidu.com" target="_blank">点击我</a>'
    return render(request, 'index.html', locals())


index.html


<h1>慕容紫英的年龄{{ d.age | add:12 }}</h1>
<h1>{{ test | cut:'on' }}</h1>
<h1>{{ test1 | cut:' '}}</h1>

<!--将时间转化成数字格式-->
<h1>{{ t | date:'Y-m-d'}}</h1>

<!--如果值是 False ,就替换成设置的默认值, 否则就是用本来的值-->
<h1>{{ e | default:'空的列表'}}</h1>

<!--后台通过过滤器内置函数safe渲染前端a标签-->
<h1>{{ a | safe }}</h1>

<!--渲染效果同上-->
{% autoescape off %}
    <h1>{{ a }}</h1>
{% endautoescape %}

这里写图片描述


条件判断与循环遍历

python后台模板条件判断语句与for语句渲染页面

views.py

def Query(request):
    t = datetime.datetime.now()
    l = ['越今朝', '越祁', '云天河']
    d = {'name': '慕容紫英', 'age': 35, 'hobby': '123'}
    c = Animal('alex', '母')
    test = 'hello python'
    num = 10
    test1 = 'hel   lo py th on'
    e = []
    a = '<a href="http://www.baidu.com" target="_blank">点击我</a>'
    return render(request, 'index.html', locals())

index.html

python页面渲染语句{{% tag %}}


<!--if-else渲染语句-->
{% if d.age > 25 %}
    {% if d.age < 50 %}
        <h1>{{ d.name }}的年龄在20~50之间</h1>
    {% else %}
        <h1>hello {{ d.name }}</h1>
    {% endif %}

{% elif d.age > 18 %}
    <h1>{{ d.name }}的年龄大于18</h1>
{% else %}
    <h1>{{ d.name }}的年龄小于18</h1>
{% endif %}




<!--for循环渲染语句-->
{% for name in l %}
    <!--按索引格式显示(计数器)-->
    <h1>{{ forloop.counter0 }} : {{ name }}</h1>
    <!--倒序计数器-->
    <h1>{{ forloop.revcounter }} : {{ name }}</h1>

{% endfor %}

<!--将l中第一个值改变颜色-->
{% for name in l %}
    {% if forloop.first %}
        <li class="first">
    {% else %}
        <li>
    {% endif %}
    {{ name }}
    </li>

{% empty %}
    <h1>l为空</h1>
{% endfor %}


页面效果

这里写图片描述


表单渲染验证

urls.py


from django.contrib import admin
from django.conf.urls import url

from app0 import views

urlpatterns = [
    url(r'login/', views.login, name="login")
]


index.html


<form action="{% url 'login' %}" method="post">
    <p>姓名:<input type="text" name="user"/></p>
    <p>密码:<input type="password" name="pwd"></p>
    <p><input type="submit"></p>
    <!--添加下面语句表示身份验证,否则第一次访问报错禁止访问-->
    <!--没有以下语句第二次访问可以正常访问-->
    {% csrf_token %}

</form>

views.py


def login(request):
    return HttpResponse('OK')

关于标签tag(写在模板中的语法)

{% with %}: 用更简单的变量名替代复杂的变量名
{% with total=sajldjalisfjaijsaf %} {{ total }} {% endwith %}
.
.
.

{% verbatim %}: 禁止render

# 页面直接显示{{ hello }}
{% verbatim %}
    {{ hello }}
{% endverbatim %}



如果自定义过滤器filter (常用,重点)

{% load … %}: 加载标签库

关于filter装饰器与simple_tag装饰器的区别


    filter可以用在if等语句后, simple_tag不可以
    eg: {% if num | filter_multi:30 > 100 %} 
            {{ num | filter_multi:30 }}
        {% endif %}

1.创建一个templatetags python package
在应用下New -> python package -> 命名为templatetags

这里写图片描述

2.在templatetags目录下创建一个自定义.py文件


from django import template
from django.utils.safestring import mark_safe

register = template.Library()   # register的名字是固定的,不可改变

# 以上为第一步 固定引用,需要牢记

#第三步: 加载引用, 在settings.py中APPS中添加配置(django自动分配)

# 第二步: 自定义一个乘法方法, 必须调用filter装饰器
# 调用了filter装饰器需要借用管道符 | 后面做区别
@register.filter
def filter_multi(x, y):
    return x * y

# 调用标签装饰器 语法与之前不一样
@register.simple_tag
def simple_tag_multi(x, y):
    return x * y

3.在index.html模板中写语法
首先加载引用,以创建my_tags.py为例
{% load my_tags %} 写在第一行

这里写图片描述


<!--执行自定义标签filter_multi-->
<!--需要借用管道符 | -->
{{ d.age | filter_multi:3 }}

<!--自定义标签不需要借用管道符-->
<!--d.age和15 对应自定义标签方法的形参-->
{% simple_tag_multi d.age 15 %}


页面显示结果

这里写图片描述


django模板继承extends和添加标签include

模板继承extends
{% extends … %} 必须保证放在模板中的第一行,否则将不起作用
{{ block.super }} 继承模板盒子内原先的内容

1.添加路径
urls.py


from django.contrib import admin
from django.conf.urls import url

from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^backend', views.backend),
    url(r'^student', views.student),
    url(r'^teacher', views.teacher),

]

2.编写视图函数 views.py


from django.shortcuts import render

# Create your views here.

def backend(request):
    return render(request, 'base.html')


def student(req):
    student_list = ['越今朝', '越祁', '明秀', '居十方']
    return render(req, 'student2.html', locals())


def teacher(req):
    teacher_list = ['涂军', '宋卫华', '乐清菊']
    return render(req, 'teacher.html', locals())

3.写一个供继承的首页模板 base.html

例如编写教务系统网站,点击学生管理后只需要变更部分div内的内容时,采用继承消除代码冗余


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

    <style>
        a{
            text-decoration:none;
            color: darkviolet;
        }
        a:hover{
            color:purple;
        }
        *{
            margin:0;
            padding:0;
        }
        .nav{
            line-height: 40px;
            width:100%;
            background-color: indigo;
            color:white;
            font-size:20px;
            text-align: center;

        }
        .left{
            width:20%;
            min-height:600px;
            overflow:auto;
            background-color: #ccc;
        }
        .manage{
            text-align: center;
            padding:15px;
            margin:20px;
            font-size:18px;

        }


        .left,.content{
            float: left;
        }

        .content{
            width:70%;
            min-height:600px;
            border:1px solid red;


        }

        h2{
            text-align: center;
        }


    </style>



</head>
<body>


<div class="outer">
    <div class="nav">标题</div>

    <div class="left">
        <div class="student manage"><a href="/student/">学生管理</a></div>
        <div class="teacher manage"><a href="/teacher/">老师管理</a></div>
        <div class="course manage"><a href="">课程管理</a></div>
        <div class="classes manage"><a href="">班级管理</a></div>

    </div>
    <div class="content">


        <!--相当于定义一个盒子,在不同页面盒子内容不一样-->
        {% block content %}
            <h2>Welcome to CQ !</h2>


        {% endblock %}



    </div>
</div>



</body>
</html>

其中需要继承后修改的的内容用{% block 类名 %}{% endblock %}括起来形成一个供修改内容的盒子

首页页面效果

这里写图片描述

  1. 点击a标签实现页面跳转
 <div class="student manage"><a href="/student/">学生管理</a></div>

步骤:
(1).点击a标签
(2).django通过href在urls.py中找到/student/路径,并匹配其对应的视图函数
url(r’^student’, views.student),
(3)django,通过路径匹配的视图函数在views.py中找到方法student,并实现其函数功能

def student(req):
    student_list = ['越今朝', '越祁', '明秀', '居十方']
    return render(req, 'student2.html', locals())

(4)django实现函数并返回用户页面 student2.html
这里写图片描述

student2.html

{% extends 'base.html' %}
{% load staticfiles %}


{% block content %}

    {{ block.super }}

    <h1>学生信息:</h1></br>
    {% for student in student_list %}
        <h2>{{ student }}</h2>
    {% endfor %}

    {% include 'test.html' %}

{% endblock %}

此处{% extends ‘base.html’ %} 继承base.html的内容
盒子内容{% block content %}{% endblock %}可对需求进行相应修改

添加标签include

承上
在templates目录下新建一个test.html

test.html

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

<h1 style="color:red">Hello World</h1>


</body>
</html>

想要在student2.html中添加标签

{% extends 'base.html' %}

<!--添加标签include的引用-->
{% load staticfiles %}


{% block content %}

    {{ block.super }}

    <h1>学生信息:</h1></br>
    {% for student in student_list %}
        <h2>{{ student }}</h2>
    {% endfor %}

    {% include 'test.html' %}

{% endblock %}

引用 {% load staticfiles %}
在需要添加的地方 添加 {% include ‘test.html’ %} 即可

猜你喜欢

转载自blog.csdn.net/qq_39469688/article/details/81938832