zoukankan      html  css  js  c++  java
  • 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' %}
    
  • 相关阅读:
    使用TortoiseGit从GitHub下拉上传代码配置
    Git 安装和使用教程(转载)
    C++的STL之map自动排序特性
    C语言实现随机生成0~100的数
    C语言实现随机生成0或1
    和 区别
    C语言文件操作函数
    php的缓冲/缓存 js对象 ,php编程的深入思考-1
    apache安装时的一些术语
    在linux下手动安装 apache, php, mysql--终极版
  • 原文地址:https://www.cnblogs.com/zx125/p/11729531.html
Copyright © 2011-2022 走看看