django视图层与模板层

视图层

1.小白必会三板斧

1.HttpResponse  # 返回字符串

2.render  # 返回一个html页面 还可以给模板传递
    from django.template import Template,Context
    def index(request):
        res = Template("<h1> {{ user }} </h1>")
        con = Context({'user':{'username':'jason','pwd':'123'}})
        ret = res.render(con)
        print(ret)
        return HttpResponse(ret)
3.redirect  # 重定向

2.JsonResponse

返回json格式数据

前后端分离就是基于json格式字符串传输数据

后端就专门写接口,前端调用你这个接口,就能拿到一个json格式的字符串

然后前端利用序列化反序列化转换成前端对应的数据类型

 js常用数据类型
            数值类型
            字符类型
            数组  []
            自定义对象 {}
            undefined与null
            布尔值 true false
            symbol

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

 python后端
                    json.dumps
                    json.loads      

3.form表单上传文件

注意事项:

  1. 提交的方式必须是post
  2. enctype参数必须有默认的urlencoded变成formdata

4.FBV与CBV

FBV(Function Based View) 基于函数的视图

CBV(Class Based View) 基于类的视图
你在类中写了两个方法 一个叫get一个叫post
前端get请求来就会触发get方法
post请求来就会触发post方法

# CBV路由
        url(r'^reg/',views.MyReg.as_view())

        @classonlymethod
        def as_view(cls, **initkwargs):
            def view(request, *args, **kwargs):
                self = cls(**initkwargs)  # cls就是我们自己的写的MyReg类
                if hasattr(self, 'get') and not hasattr(self, 'head'):
                    self.head = self.get
                self.request = request
                self.args = args
                self.kwargs = kwargs
                # 上面的一通操作 就是给我们自己写的类的对象赋值
                return self.dispatch(request, *args, **kwargs)
                # 对象在查找属性或方法的时候 顺序是什么?  先从自己找 再从产生对象的类中找  再去类的父类中找...
                """也就意味着你在看源码的时候 你一定要牢记上面的话"""
            return view

        # views.py
        from django.views import View

        class MyReg(View):
            def get(self,request):
                return render(request,'reg.html')

            def post(self,request):
                return HttpResponse("我是MyReg类中post方法")

        """CBV最精髓的部分"""
        def dispatch(self, request, *args, **kwargs):
            if request.method.lower() in self.http_method_names:  # 判断当前请求方式在不在默认的八个请求方式中
                handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
                # handler = getattr(自己写的类产生的对象,'小写的请求方法(get\post)','获取不到对应的方法就报错')
                # handler就是我们自己定义的跟请求方法相对应的方法的函数内存地址
            else:
                handler = self.http_method_not_allowed
            return handler(request, *args, **kwargs)  # 在调用获取到的方法

    django settings源码分析及实际应用(你可以不掌握 但是我希望你掌握思路)

        django的配置文件有两个
            一个是暴露给用户可以自定义配置的
            一个是默认的全局配置文件
                用户指定了就用用户的
                用户没有指定就用默认的

        from django.conf import settings

        settings = LazySettings()

        class LazySettings(LazyObject):

            def _setup(self, name=None):

                # os.environ你可以把它看成是一个全局的大字典
                settings_module = os.environ.get(ENVIRONMENT_VARIABLE)  # 从大字典中取值
                # settings_module = 'day59.settings'

                self._wrapped = Settings(settings_module)  # Settings('day59.settings')

        class Settings(object):
            def __init__(self, settings_module):  # settings_module = 'day59.settings'
                for setting in dir(global_settings):  # 循环获取global_settings文件中所有的名字
                    if setting.isupper():  # 在判断名字是否是大写
                        # 如果是大写 利用反射 获取到大写的名字所对应的值  不停地添加到对象中
                        setattr(self, setting, getattr(global_settings, setting))
                # store the settings module in case someone later cares
                self.SETTINGS_MODULE = settings_module
                mod = importlib.import_module(self.SETTINGS_MODULE)  # 'day59.settings'
                # from day59 import settings
                # mod 指代的就是暴露给用户的配置文件模块名

                for setting in dir(mod):  # 循环获取暴露给用户配置文件中所有的名字
                    if setting.isupper():  # 判断是否是大写
                        setting_value = getattr(mod, setting)  # 如果是大写 获取大写的变量名所对应的值
                        setattr(self, setting, setting_value)  # 不停的给对象设置值

5.模板传值

传函数名的时候 会自动加括号调用函数 将函数的返回值展示在html页面上
django模板语法不支持函数传参
django模板语法在获取容器类型内部元素的值的时候 统一只采用 句点符(.)

6.过滤器(|)与标签

(前端代码并不一定非要在前端写  你也可以在后端写好 传递给前端页面)
前后端取消转义
 前端
      |safe
 后端
      from django.utils.safestring import mark_safe
      sss2 = "<a href='http://www.xiaohuar.com'>下午上课 需要激情</a>"
      res = mark_safe(sss2)
"""
模板语法的符号就两种
{{}}  变量相关
{%%}  逻辑相关

"""

标签
    if判断
    for循环

7.自定义过滤器,标签

步骤:
1 在应用名下面新建一个templatetags文件夹(必须叫这个名字)
2 在改文件夹下 新建一个任意名称的py文件
3 在该py文件内 固定先写两行代码
    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)

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

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

8.模板的继承

事先需要再模板中 通过block划定区域
    {% block 区域名字 %}

    {% endblock %}
子板中如何使用
    {% extends '模板的名字'%}

    {% block 区域名字 %}
        <h1>登录页面</h1>
    {% endblock %}

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

    {% endblock %}

    {% block content %}

    {% endblock %}

    {% block js %}

    {% endblock %}

子板中还可以通过
    {{ block.super }}  来继续使用母版的内容

9.模板的导入

当你写了一个特别好看的form表单 你想再多个页面上都使用这个form表单
你就可以将你写的form表单当作模块的形式导入 导入过来之后 就可以直接展示
{% include ‘good_page.html‘ %}

原文地址:https://www.cnblogs.com/aden668/p/11727585.html

时间: 2024-08-05 04:12:03

django视图层与模板层的相关文章

Django基础之视图(views)层、模板层

目录 Django基础之视图(views)层.模板层 JsonResponse 向前端返回一个json格式字符串的两种方式 重写Django中的json的某个方法 form表单上传文件 FBV与CBV FBV CBV最精髓的部分 Django settings源码分析及实际应用 模板传值 过滤器(|) 标签 前端if 标签 前端for标签 前端with标签 自定义过滤器.标签 自定义的过滤器 自定义标签 自定义的过滤器和自定义标签 模板的继承 模板的导入 Django请求生命周期 Django基

肆拾陆 ---django视图层与模板层

django视图层与模板层 一.视图层 1.1 HttpResponse.render.redirect ? HttpResponse:返回字符串: ? redirect:重定向 ? render:返回一个html页面,也可以给模板传值 ? render的逻辑原理: from django.template import Template,Context def index(request): res = Template('<h1>{{ user }} </h1>') con =

Django(视图层、模板层)

render原理: def ab_render(request): temp = Template("<h1>{{ user_dict }}{{ user_dict.username }}{{ user_dict.password }}</h1>") user_dict = Context({'user_dict':{'username':'jason','password':123}}) res = temp.render(user_dict) return

django 之 视图层、模板层

目录 视图层 模板层 视图层 一.视图函数返回的都是一个HttpResponse对象 render 和 redirect 都是直接或者间接传的 二.JsonResponse 下面这个是正常的json的序列化 views.py 层 def test1(request): user_dict={'username':'jason 顶天立地 ','password':123} json_str= json.dumps(user_dict,ensure_ascii= False)###保证中文不会转成b

DJANGO入门系列之(模板层的简单介绍和视图层的扫尾)

昨日回顾:1 虚拟环境 -1 pycharm里创建 -2 用命令串讲2 视图层: 1 Request对象---GET,POST,method,body,FILES,META,path(只是路径),get_full_path(拿到全路径,带数据), 2 HttpResponse对象--->render,redirect,HttpResponse,JsonResponse(返回json格式) 3 反向解析--->在视图层:本质为了去除地址,重定向来用;在模板层:取出地址,为了发请求来用 4 Jso

Django(七)—— 模板层:变量、过滤器、标签、自定义标签和过滤器

模板层:变量.过滤器.标签.自定义标签和过滤器 将页面的设计和Python的代码分离开会更干净简洁更容易维护. 我们可以使用 Django的 模板系统 (Template System)来实现这种模式 # django模板修改的视图函数 def current_time(req): from django.template import Template,Context now=datetime.datetime.now() t=Template('<html><body>现在时刻

1126 视图层与模板层

目录 昨日内容回顾 一. 视图层 路由配置主页与404 1. 三大板斧 HTTPresponse render redirect 2. JsonResponse对象 基础 json转码 使用JsonResponse直接return safe序列化字典之外 3. FBV与CBV 定义 CBV 装饰器 4. request对象 二. 模板层 1. 常用语法 2. 变量 3. 模板传值 方法locals() 类型 函数 类 4. 过滤器| 定义 语法 常见内置filter 使用 前后端的取消转义 5.

Django视图层、模板层

过滤器方法 upper 大写方式输出 add 给value加上一个数值 capfirst 第一个字母大写 center 输出指定长度的字符串,把变量居中 cut 删除指定字符串 date 格式化日期 default 如果值不存在,则使用默认值代替 length 返回列表中元素的个数或字符串长度 length_is 检查列表,字符串长度是否符合指定值 标签的方法 for标签 {% for 临时遍历 in 序列%}....{%endfor%} forloop.counter 当前循环的索引值(从1开

Django的View(视图)、settings源码的解析、模板层

一.FBV与CBV 视图函数并不只是指函数,也可以是类 FBV:基于函数的视图,类似面向函数式编程 CBV:基于类的视图,类似面向对象编程 研究解析render源码: render:返回html页面:并且能够给该页面传值 分析:FBV视图原理 from django.shortcuts import render,HttpResponse # Create your views here. from django.template import Template,Context # FBV解析