Django-视图层

Django-视图层

三板斧

from django.shortcuts import render,HttpResponse,redirect
HttpResponse  # 返回字符串的  
    
render  # 返回html页面,可以传值 
      
redirect  # 重定向

返回的底层其实都是HttpResponse对象

JsonResponse

给前端返回json字符串
from django.http import JsonResponse

zx = {'username': 'zx 我好喜欢哦~', 'pwd': 'zx123'}
return JsonResponse(zx)

底层调用的就是json模块

data = json.dumps(data, cls=encoder, **json_dumps_params)
ensure_ascii=True
但是默认会把字符串转成ascii,所以要把
return JsonResponse(zx,json_dumps_params={'ensure_ascii':False})

注意:JsonResponse默认只支持序列化字典 如果你想序列化其他类型(json能够支持的类型) 你需要将safe参数由默认的True改成False

l = [1,2,3,4,5,5,6]
return JsonResponse(l,safe=False)

序列化和反序列化

JSON.stringify 序列化   >>>   json.dumps
JSON.parse     反序列   >>>   json.loads

图片上传

前端

注意:提交方式必须是post,post是不限制大小的,还要修改entype属性

<form method="post" enctype="multipart/form-data" >
    <input type="file" name="zx">
    <input type="submit">
</form>

后端

request直接把数据这块和POST的数据区分开了,拿取文件数据的时候要用FILES

    if request.method == 'POST':
        file_obj = request.FILES.get('zx')
        print(file_obj.name)#文件名
        with open(file_obj.name,'wb')as fw:
            for line in file_obj:
                fw.write(line)

模板语法

{{}} 变量相关

{%%} 逻辑相关

模板{{}}传值

注意

1.函数对象渲染会执行函数,把返回值传到界面

2.不支持函数传递带参

3.对于容器和对象元素只能通过点取值

过滤器|

{{n|add:100}}

看add源码

@register.filter(is_safe=False)
def add(value, arg):
    """Adds the arg to the value."""
    try:
        return int(value) + int(arg)
    except (ValueError, TypeError):
        try:
            return value + arg
        except Exception:
            return ''

{{n|length}}

{{zx|filesizeformat}}文件大小

{{w|truncatechars:10}}截取10个字符...也算

{{w|truncateword:10}}按照空格...不算

{{xxx|default:"这个值为空"}}有值就拿值 没值就用后面默认的

{{zx|slice'0,5,2'}}切片

{{ctime|date:'Y-m-d'}}日期格式化

{{ss|safe}}转义 前端代码可以在后端写好

逻辑{%%}模板

if-elif-else-endif

{% if zx %}
<h1>zx不为空</h1>
{% elif zx1 %}
<h1>zx1不为空</h1>
{% else %}
<h1>全为空</h1>
{% endif %}

for基础用法

简单用法
{% for l in lis %}
    <p>{{ l }}</p>
{% endfor %}

字典用法
{% for foo in d.items %}
    <p>{{ foo }}</p>
{% endfor %}

{% for foo in d.keys %}
    <p>{{ foo }}</p>
{% endfor %}

{% for foo in d.values %}
    <p>{{ foo }}</p>
{% endfor %}

for高级用法

直接打印forloop,可以给列表加标号

{% for l in zx %}
    {{ forloop }}
{% endfor %}
{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 6, 'revcounter0': 5, 'first': True, 'last': False}

    {'parentloop': {}, 'counter0': 1, 'counter': 2, 'revcounter': 5, 'revcounter0': 4, 'first': False, 'last': False}

    {'parentloop': {}, 'counter0': 2, 'counter': 3, 'revcounter': 4, 'revcounter0': 3, 'first': False, 'last': False}

    {'parentloop': {}, 'counter0': 3, 'counter': 4, 'revcounter': 3, 'revcounter0': 2, 'first': False, 'last': False}

    {'parentloop': {}, 'counter0': 4, 'counter': 5, 'revcounter': 2, 'revcounter0': 1, 'first': False, 'last': False}

    {'parentloop': {}, 'counter0': 5, 'counter': 6, 'revcounter': 1, 'revcounter0': 0, 'first': False, 'last': True}

用法

{% for foo in zx %} 
    {% if forloop.first %}
        <p>这是我的第一次</p>
    {% elif forloop.last %}
        <p>这是最后一次了啊</p>
    {% else %}
        <p>我在中间~</p>
    {% endif %}
{% endfor %}

#注意当xo为空是可以进入for的,而且可以和{% empty %}一起用
{% for l in zx %}
    <h1>不是空啊</h1>
    {% empty %}
    <h1>空啊</h1>
{% endfor %}

取别名{%with%}

{% with  yyy.user_list.2.username.1 as dsb %}
    <p>{{ dsb }}</p>
    <p>{{ yyy.user_list.2.username.1 }}</p>
    <p>{{ dsb }}</p>
{% endwith %}

自定义过滤器、标签

步骤

1 在应用名下面新建一个templatetags文件夹(必须叫这个名字)
2 在改文件夹下 新建一个任意名称的py文件
3 在该py文件内 固定先写两行代码
from django.template import Library

register = Library()

案例

from django.template import Library
register = Library()

@register.filter(name='myplus')
def index(a,b):
    return a + b

@register.simple_tag(name='mysm')
def login(a,b,c,d):
    return '%s/%s/%s/%s'%(a,b,c,d)

使用时注意添加

{% load my_tag %}

自定义

{{ 123|myplus:123 }}

{{ 123|myplus:'[1,2,3,4,5,6,7,8,]' }}这样可以在函数内拆分字符串实现,列表内数字取出应用

{% load my_tag %}
{% mysm 1 2 3 4 %}

区别

区别 标签不能再if中使用
{% if 0|myplus:123 %}  可以用
<p>有值</p>
{% endif %}


{% if mysm 1 2 3 4 %}  不能用
<p>有值</p>
{% endif %}

模板继承

定义

{% block 区域名字 %}

{% endblock %}

母模板

事先需要在母模板中 通过block划定区域
    {% block css %}

    {% endblock %}
    
    {% block content %}
    <div class="jumbotron">
    <h1>Hello, world!</h1>
    <p>...</p>
    <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
    </div>
    {% endblock %}
    
    {% block js %}

	{% endblock %}

子继承

{% extends '模板的名字'%}

    {% block css %}
		css
    {% endblock %}
    
    {% block content %}
		html
    {% endblock %}
    
    {% block js %}
		js
	{% endblock %}

一个页面上 block块越多 页面的扩展性越高
通常情况下 都应该有三片区域
{% block css %}

{% endblock %}

{% block content %}

{% endblock %}

{% block js %}

{% endblock %}

子板中还可以通过
{{ block.super }}  来继续使用母版的内容,注意是放在block块里面使用,而且可以叠加

模板的导入
当你写了一个特别好看的form表单 你想再多个页面上都使用这个form表单
你就可以将你写的form表单当作模块的形式导入 导入过来之后 就可以直接展示
        
        {% include 'good_page.html' %}
posted @ 2019-10-23 22:40  zx125  阅读(93)  评论(0编辑  收藏  举报