一、Django基础–views视图函数

“这是我参与更文挑战的第2天,活动详情查看: 更文挑战”

视图 CBV和FBV

FBV

function based view ,平常用函数写的就是FBV

CBV

class based view ,用面试对象的方式就是CBVfrom django.views import Viewclass xxx(View):def dispatch(self, request, *args, **kwargs):return super().dispatch(request, *args, **kwargs)#其实def get(self,request):#专门处理get请求return responsedef post(self,request):#专门处理post请求 return responseurl(r"xx/",xxx.as_view()) # 类名.as_view()执行

as_view()的流程

1. 项目运行时加载urls.py文件,执行类,as_view()方法
2. as_view()执行后,内部定义了一个view函数,并且返回.
3. 请求到来的时候,执行view函数1. 实例化类--> self2. self.request = request3. 执行self.dispath(request,*args,**kwargs)方法1. 判断请求方式是否被允许1. 允许: - 通过反射获取请求方式对应的请求方法--->handler f.html_method_not_allowed -->handler2. 不允许:- self.http_method_not_allowed -->handler2. 执行hanlder,返回结果 # http_method_names = ['get'] #只允许提交的请求方法,内部执行View这个函数的时候,就会先访问这个类,这个http_method_names就会覆盖内部的这个方法
def dispatch(self, request, *args, **kwargs):print("dispatch执行前的操作")ret = super().dispatch(request, *args, **kwargs)#其实就是执行View里面内部的dispatch方法print("dispatch执行后的操作")return ret

CBV执行get和post方法前会,先执行dispatch方法

使用过程CBV

1. 写url url(r"^books/$", views.books.as_view()),
2. 在视图函数写方法# url.py
urlpatterns = [url(r'^admin/', admin.site.urls),url(r"^books/$", views.books.as_view()),
]# views.py
from django.views import Viewclass books(View):def dispatch(self, request, *args, **kwargs):print("1")func = super().dispatch(request, *args, **kwargs)print("2")return funcdef get(self, request):# 专门处理get请求return render(request, "login.html")def post(self, request):# 专门处理post请求user = request.POST.get("user")password = request.POST.get("password")user_obj = models.User.objects.filter(username=user, password=password)if not user_obj:return render(request, "login.html")return render(request, "index.html")

FBV,CBV加装饰器

FBV加装饰器

直接加在函数上就行了

CBV加装饰器

需要使用一个装饰器,导入包method_decorator

from django.utils.decorators import method_decorator
@method_decorator 是将函数装饰器转换成方法装饰器。
  1. 加在方法上

    @method_decorator(timer)
    def get(self, request): #这样就只能get方法可以用

    1. 加在dispatch方法上

    @method_decorator(timer) #里面的定义的请求方法都可以用
    def dispatch(self, request, *args, **kwargs):
    print(“dispatch执行前的操作”)
    ret = super().dispatch(request, *args, **kwargs)#其实就是执行View里面内部的dispatch方法
    print(“dispatch执行后的操作”)
    return ret

    1. 加在类上

    @method_decorator(timer,name=“get”)
    @method_decorator(timer,name=“post”)
    @method_decorator(timer,name=“dispatch”)
    class PublishersAdd(View): #加在类上,可以指定对应的方法

装饰器:timer

# 统计时间的装饰器
import time
from functools import wrapsdef timer(func):@wraps(func)def inner(*args, **kwargs):"""inner内部函数"""start = time.time()ret = func(*args, **kwargs)print("执行一共用时:{}".format(time.time() - start))return retreturn inner@timer
def func():"""我是func函数"""time.sleep(0.5)print("aaaa")func()
print(func.__name__)  #打印函数名 inner (只有加 @wraps(func),才可以输出func,自己的函数名)
print(func.__doc__) #打印函数中的注释from functools import wraps
@wraps(func) #加wraps才可以输出自己的函数,和注释,不然会输出内部函数里面

request(请求)

常用属性:
request.method  请求方法 GET POST
request.GET  URL上携带的参数  ?k1=v1$k2=v2 {}
request.POST post请求提交的数据 {} 编码方法是URLencode
request.path_info  路径信息 不包含IP和端口 也不包含参数    /publisher_list/
request.body 请求体,byte类型 request.POST的数据就是从body里面提取到的(获取的是post请求提交的内容)
request.COOKIES cookies
request.session session类似于字典的对象
request.FILES  上传的文件
request.META  头的信息   小写-->大写  HTTP_开头不常用属性:
request.scheme() http或https
request.path() 表示请求的路径组件(不含域名)常用方法:
request.get_full_path()    完整的路径信息 不包含IP和端口 ,包含参数
request.is_ajax()  请求是否是ajax请求

response(响应)

from django.shortcuts import render, HttpResponse, redirectHttpResponse("字符串")  #返回字符串
render(request,"模板的文件名",{'k1':v1})  #返回一个HTML页面
redirect('地址') #重定向  其实就是给了 Location '地址'和状态码 301 302from django.http import JsonResponsedef text_json(request):a = {"a":"b"}b = ["aa","bb"]return JsonResponse(b,safe=False)  #加safe=False了可以传递列表

二、Django基础–模板语法

模板常用语法

return render(request,“模板的文件名”,{“k1”:“xxx”}) #返回一个HTML页面

  1. Django模板中只需要记两种特殊符号:
    1.1 {{ }}和 {% %}
    1.2 {{ }}表示变量,在模板渲染的时候替换成值,{% %}表示逻辑相关的操作。

  2. 点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值

    数字:{{ num }}

    字符串:{{ string }}

    字典:{{ name_dict }} --> {{ name_dict.keys }} --> {{ name_dict.values }} --> {{ name_dict.name }}

    列表:{{ name_list }} --> {{ name_list.2 }}

    集合:{{ set }} --> {{ set.1 }}

    元组:{{ tup }} --> {{ tup.0 }}

    类:{{ person }} --> {{ person.name }} --> {{ person.talk }}

    .
    .索引 .key .属性 .方法(方法后面不加括号)
    优先级:
    .key > .属性 .方法 > .索引

过滤器

过滤器的语法: {{ value|filter_name:参数 }}

使用管道符"|"来应用过滤器。

  1. 过滤器:Filters

    return render(request,“template_text.html”,{“new_num”:""})

    {{变量|过滤器:“参数”}}
    default:
    变量不存在或者为空时使用默认值 ,如果value值没传的话就显示nothing
    {{ new_num|default:“2” }}

  2. filesizeformat

    将值格式化为一个 “人类可读的” 文件尺寸 (例如 ‘13 KB’, ‘4.1 MB’, ‘102 bytes’, 等等)

    return render(request, “template_text.html”, {“value”: 1024 * 1024 * 1024})

    {{ value|filesizeformat }} # filesizefomrat:1.0 GB

  3. add +

    给变量加参数
    数字的加法,字符串和列表的拼接
    add:{{ value2|add:“2” }} --> 列表相加:{{ name_list|add:name_list }} #add:4 --> 列表相加:[‘张三’, ‘李四’, ‘王五’, ‘张三’, ‘李四’, ‘王五’]

  4. lower,upper,title

    小写:{{value|lower}}
    大写:{{value|upper}}
    标题:{{value|title}} #首字母大写

    可以写在一起:{{value|upper|lower|title}}

  5. length

    {{ value|length }}

    返回value的长度,如 value=[‘a’, ‘b’, ‘c’, ‘d’]的话,就显示4.

  6. slice 切片

    {{ name_list|slice:“0:2” }} #和python一样就是没有[]号 [0:2]

  7. first,last

    {{value:first}} #取第一个元素 和 {{value.0}}一样
    {{value:last}} #取最后一个元素

  8. join 字符串拼接

    使用字符串拼接列表。同python的str.join(list)。
    {{ value|join:" __ " }} #张三__李四__王五

  9. truncatechars 字符串截取

    如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“…”)结尾。
    参数:截断的字符数
    {{ long_str|truncatechars:9 }} #包括3个省略号 Django…
    truncatewords :根据单词截断

  10. date 日期格式化

    import datetime
    now = datetime.datetime.now()

    {{ now|date:“Y-m-d H:i:s” }}2020-08-08 10:17:14

    或者直接在settings.py里面定义格式
    1. USE_L10N = False
    2. 设置格式:
    DATETIME_FORMAT = ‘Y-m-d H:i:s’
    TIME_FORMAT = ‘H:i:s’
    DATE_FORMAT = ‘Y-m-d

     然后直接:{{ now }},就和上面一样的
    
  11. safe

    Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全
    比如:
    “safe_text”:“点我”,
    {{ safe_text}}
    我们就会在页面上获得字符串:点我

    有时候我们不想这样,我们就可以加个safe
    {{safe_text|safe}} # 点我

  12. mark_safe

    from django.utils.safestring import mark_safe

    @register.filter
    def show_b(name,url):

     return mark_safe('<a href="{}">{}</a>'.format(url,name))  #直接这样写就不用在用的时候加safe了
    

    {{ ‘百度’|show_b:“http://www.baidu.com” }}

自定义过滤器 filter

  1. 在app下创建一个名为templatetags的python包(包的名字不能错,必须叫templatetags)

  2. 创建一个python文件,文件名自定义(mytags.py)

  3. 创建自定义过滤器:
    from django import template

    register = template.Library()  # register的名字不能错@register.filter
    def add_arg(value, arg): #只能写二个参数,一个是变量,一个是过滤器的参数# 功能return "{}__{}".format(value, arg)
    
    1. 在html中使用
      在模板中:
      {% load mytags %} #先用load加载 mytags这个文件
      {{ person.name|add_arg:“我爱你” }}

母版和继承

母版:

1. 一个包含多个页面的公共部分2. 定义多个block块,让子页面进行覆盖
复制代码

继承:

1. {% extends "母版的名字" %}  # xx.html
{#    留着模板的内容#}
{{ block.super }}
复制代码
2. 重新复写block块 (就是覆盖了母版的block块)
复制代码

注意点:

  1. {% extends “母版的名字” %} 母版的名字带引号
  2. {% extends “母版的名字” %} 写在第一行,上面不在写内容
  3. 要显示的内容要写到block块里面
  4. 多写一个css\js的block块(因为每一个页面的css\js不可能完全一样)

创建母版:{% load static %}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>母版</title><style>div{width: 500px; height: 500px; border: 2px solid red;}</style>{% block css %} {% endblock %}  {# css#}
</head>
<body><div><a href="">你要干什么?</a></div>{% block content %} {# 内容#} {% endblock %}{% block js %} {# js#} {% endblock %}
</body>
</html>使用母版:{% extends "Master.html" %}{% block css %}<style>div{background-color: blueviolet;}</style>
{% endblock %}{% block content %}<h1>123321</h1>
{% endblock %}{% block js %}{% endblock %}

组件 include

可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方,文件的任意位置按如下语法导入即可。
复制代码
  1. 把一小段公用的HTML文本写入一个HTML文件,nav.html
  2. 在需要该组件的模版中导入
    {% include ‘nav.html’ %}

示例

创建组件
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>组件</title><style>*{list-style: none; margin: 0; padding: 0;}div{height: 50px; border: 1px solid red;}div ul li{width: 100px; height: 35px; border: 1px solid green; margin-left: 50px; float: left;}</style>
</head>
<body><div><ul><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul></div>
</body>
</html>使用组件
{% extends "Master.html" %}{% block css %}<style>div{background-color: blueviolet;}</style>
{% endblock %}{% block content %}{% include "nav.html" %}<h1>123321</h1>
{% endblock %}{% block js %}{% endblock %}

标签tags

  1. for

    • {% for name in name_list %}
    • {{ forloop.counter }}-{{ name }}
    • {% endfor %}

for循环可用的一些参数:

Variable Description
forloop.counter 当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(到1结束)
forloop.revcounter0 当前循环的倒序索引值(到0结束)
forloop.first 当前循环是不是第一次循环(布尔值)
forloop.last 当前循环是不是最后一次循环(布尔值)
forloop.parentloop 本层循环的外层循环

for …empty

{% for name in name_list2 %}<li>{{ name }}</li>
{% empty %}为空了   #如果循环的对象为空的话,就输出它
{% endfor %}
  1. if

    {% if value2 > 2 %}
    可以
    {% elif value2 == 2 %}
    不错
    {% endif %}

if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

注意:

  1. 条件中不支持算术运算
  2. 不支持连续判断
    {% if 5 > 4 > 1 %} 这样会报错 只有改成{% if 5 > 4 and 4 > 1 %}
    ok
    {% else %}
    no
    {% endif %}

with

就是重命名

{% with name_list as name%}{{ name }}{{ name }}
{% endwith %}或者
{% with name = name_list %}{{ name }}{{ name }}
{% endwith %}

自定义标签 simple_tag

  1. app应用文文件夹中创建templatetags文件夹,必须是这个名字;

  2. templatetags文件夹中创建一个xx.py文件,名字可以随便起。

  3. 创建自定义标签

    from django import templateregister = template.Library()  # register固定的名字@register.simple_tagdef mytag(v1):s = v1 + '我爱你'return s@register.simple_tagdef mytag2(v1, v2, v3):s = v1 + v2 + v3return s
    
  4. 使用 html文件中的 {% load 文件名 %} {% load te %} {% mytag s1 %} {% mytag2 s1 ‘yyz’ ‘lt’ %}

  5. 注意:参数可以有多个。

inclusion_tag

filter, simple_tag,inclusion_tag

没有参数限制的

  1. 在app下创建一个名为templatetags的python包(包的名字不能错,必须叫templatetags)
  2. 创建一个python文件,文件名自定义(mytags.py)
  3. 在python包中写:
    from django import template
    register = template.Library() # register的名字不能错

    1. 写函数+加装饰器
      filter:
      def add_arg(value,arg): #只能接受一个参数和值
      return “xx”

      simple_tag:
      @register.simple_tag # 可以接受多个参数和值
      def str_join(args, kwargs):
      return “{}_{}”.format("—".join(args), "
      ".join(kwargs))

      inclusion_tag:
      @register.inclusion_tag(“page.html”) #把值返回到page.html页面上
      def pagination(num):
      return {‘num’: range(1, num + 1)} # 需要返回的是一个字典

    2. 使用
      filter:
      {% load mytags %}
      {% “alex”| add_arg:“我爱你” %}

      simple_tag:
      {% load mytags %}
      {% str_join “a” “b” “c” k1=“aa” k2=“bb” %}
      {#a—b---c_k1***k2#}

      inclusion_tag:
      {% load mytags %}
      {% pagination 6 %}

实例(分页)

from django import template
from django.utils.safestring import mark_saferegister = template.Library()# 方法一
@register.simple_tag
def pagination(num):page_list = ['<li><a href="#">{}</a></li>'.format(i) for i in range(1,num+1)]print(page_list)return mark_safe("""<nav aria-label="Page navigation"><ul class="pagination"><li><a href="#" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>{}<li><a href="#" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li></ul>
</nav>""".format(''.join(page_list)))# 方法二:
@register.inclusion_tag("page.html")
def pagination(num):return {'num': range(1, num + 1)}  # 需要返回的是一个字典<nav aria-label="Page navigation"><ul class="pagination"><li><a href="#" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>{% for page in num %}<li><a href="#">{{ page }}</a></li>{% endfor %}<li><a href="#" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li></ul>
</nav>

views视图函数-模板语法相关推荐

  1. python 视图对象_python web框架篇:views视图函数

    Django请求的生命周期是怎样的? 简单地说,通过URL对应关系匹配 ->找到对应的函数(或者类)->返回字符串(或者读取Html之后返回渲染的字符串) 解剖起来如下: 1. 当用户在浏 ...

  2. 模板 (函数模板语法 ,类模板与函数模板的区别,:函数模板案例,普通函数与函数模板的区别,普通函数与函数模板调用规则,模板的局限性,类模板分文件编写.cpp,Person.hpp,类模板与友元)

    **01:函数模板语法: #include<iostream> using namespace std;//交换两个整型函数 void swapInt(int &a ,int &a ...

  3. PHP:ThinkPHP5.0视图View模板语法

    1.模板路径 控制器地址 app/index/controller/Index 传参示例 说明 获取模板路径 view() 默认模板的地址 app/index/view/index/index.htm ...

  4. Python的web框架Django(1):HTTP、简介、静态文件配置、路由系统、视图函数、模板语言、ORM、Ajax、分页器、forms、Cookie、Session、中间件、ModelForm

    1. HTTP协议 1)HTTP请求协议 请求格式 POST(方法) /form/entry(URI) HTTP/1.1(协议版本) HOST:hackr.jp(服务端地址) Connection:k ...

  5. Python框架篇之Django(路由系统URL、视图函数views)

    文章目录 一.路由系统(URL) 二.视图函数(views) 一.路由系统(URL) 1.URL配置 (URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用 ...

  6. Flask视图、模板、模型

    Day01 Flask前期了解: 为什么要使用框架: web网站发展至今,特别是服务器端,涉及到的知识.内容,非常广泛.这对程序员的要求会越来越高.如果采用成熟,稳健的框架,那么一些基础的工作,比如, ...

  7. django目录下的路由系统和视图函数

    一.Django路由系统(url) 1.什么是路由系统 路由系统的本质是URL模式以及要为该URL模式调用的视图函数之间的一个映射表即不同的url路径对应的不同的函数,该路由系统是存放在全局配置文件u ...

  8. flask---》url_for 模板语法 内置过滤器 url_map

    url_for 后端 无参数 endpoint起一个别名,如果不写默认是函数名称 视图 @app.route('/', endpoint='index') def index():return ren ...

  9. flask篇B2,重定向,url_for,模板语法

    重定向与url_for 在app1.py文件中 from flask import Flask, request, redirect,url_for from flask import render_ ...

最新文章

  1. CNN、RNN、GAN都是什么?终于有人讲明白了
  2. 导出mysql excel数据字典_mysql导出 Excel数据字典(全)
  3. rsync配置和使用
  4. win11如何查看下载速度 Windows11查看下载速度的方法介绍
  5. DevOps使用教程 华为云(5)迭代计划 进度管理
  6. 大数据面试题及答案-汇总版
  7. gradle命令中api和implement的区别
  8. idm integration module(idm) Chrome插件 安装
  9. electron关闭硬件加速
  10. 解决错误:org.apache.ibatis.binding.BindingException
  11. RxJava模式与原理-----标准观察者与RxJava观察者
  12. 2021-2027全球与中国外部谷仓门市场现状及未来发展趋势
  13. 本次给大家来个简单的一元二次方程求解的编程
  14. ps中怎么导出tif_用Photoshop自动切割大型TIFF文件并将切片保存到TIFF文件中?
  15. 海康iSecure Center 综合安防管理平台安装部署教程 - CentOS系统
  16. 那是无英勇的生活战士用生命换来的
  17. 亚马逊程序员:我曾拼命逃离996!
  18. android 英文字典,爱疯不忘学英语 实测10款Android词典
  19. Jquery方法实现图片放大缩小
  20. c语言 称重系统设计,动态称重系统设计.doc

热门文章

  1. 收到朋友寄来的煎饼了
  2. ActiveRecord学习笔记(四):处理Many-To-Many映射
  3. fabric-ca 登记身份时报Error: Response from server: Error Code: 20 - Authentication failure
  4. Spring 框架简介及官方压缩包目录
  5. 济南计算机学校排名2015,济南高中排名前十名有哪些
  6. 解析xml_QT开发(四十四)——流方法解析XML
  7. web前端技术亮点_Web前端开发职业技术要求规划
  8. 有关VUE学习的经验(2)
  9. 关于 ls 命令的一个小小的缺陷
  10. ISACA:网络安全人员短缺仍是老大难问题