美文网首页工作生活
深入理解Django静态文件以及模板详解

深入理解Django静态文件以及模板详解

作者: EchoPython | 来源:发表于2019-07-01 15:04 被阅读0次

    Django运行模式

    image

    Django MTV图片介绍

    image

    静态文件

    TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': 
    [os.path.join(BASE_DIR, 'templates')]       # 系统能调用模版,'APP_DIRS': True,'OPTIONS': 
    {'context_processors': 
    ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},]
    

    模板

    • 使用构建html网页

    • 原始的:直接将html字符串硬编码到HttpResponse中。

    class Login(View):def get(self, request):return HttpResponse("<h1>hello world</h1>")

    • 使用render进行渲染。

    class Login(View):def get(self, request):return render(request, "login.html")

    • 使用django.template.loader下的get_template方法进行渲染。

    class Login(View):def get(self, request):t = get_template("login.html")return HttpResponse(t.render())ps: 进阶用法,这里只是介绍

    • 模板引擎的选择

    • Django自带了一个模板系统,叫做DTL(Django Template Language)。

    • 一个比较流行的模板系统,叫做Jinja2。

    • 配置:可以在settings文件中的TEMPLATES->BACKEND进行配置,默认使用的是django自带的DTL。配置DTL:'BACKEND': 'django.template.backends.django.DjangoTemplates',配置Jinja2:django.template.backends.jinja2.Jinja2

    TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': 
    [os.path.join(BASE_DIR, 'templates')],'APP_DIRS': True,'OPTIONS': {'context_processors': 
    ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},]
    
    • 模板变量

    • 先将值传进去

    message = u"欢迎使用学员登录系统"return render(request, "login.html",{"message": message})ps: 如果不想引用,可以使用locals(),locals()指获取当前能获取到的变量,形成一个字典 例: return render(request, "login.html",locals())

    • 在模版中使用

    • 语法:{{变量名}}

    • 命名由字母和数字以及下划线组成,不能有空格和标点符号。

    • 不要和python或django关键字重名。原因:如果data是一个字典,那么访问data.items将会访问data这个字典的key名为items的值,而不会访问字典的items方法。

    例:<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Title</title></head><body>{{ message }}</body></html>

    • 模板标签

    • 标签语法:{% 标签名称 %}{% 结束标签名称 %}例: {%tag%}{%endtag%}

    • if/elif/else:可以使用and/or/in/not/==/!=/<=/>=,来进行判断。ifequal/ifnotequal

    {% if now %}当前时间: {{ now|date:"Y-m-d H:i:s" }}{% endif %}

    • for…in…:跟python中的for…in…是一样的用法

    {% for m in modules %}{{ m }}{% end %}

    • forloop.counter:当前迭代的次数,下标从1开始。

    • forloop.counter0:当前迭代的次数,下标从0开始。

    • forloop.first:返回bool类型,如果是第一次迭代,返回true,否则返回false。

    • forloop.last:返回bool类型,如果是最后一次迭代,返回True,否则返回False。

    • 过滤器

    • 作用:对变量进行过滤。在真正渲染出来之前,过滤器会根据功能处理好变量,然后得出结果后再替换掉原来的变量展示出来。

    • 语法:{{greeting|lower}}

    • 变量和过滤器中间使用管道符号”|”进行使用。

    • 可以通过管道符号进行链式调用,比如实现一个功能,先把所有字符变成小写,把第一个字符转换成大写,代码如下:

    {{message|lower|capfirst}}

    • 过滤器可以使用参数,在过滤器名称后面使用冒号”:”再加上参数,比如要把一个字符串中所有的空格去掉,则可以使用cut过滤器,代码如下

    {{message|cut:" "}}ps: 使用参数的时候,冒号和参数之间不能有任何空格,一定要紧挨着。

    • R和time过滤器格式

    获取当前时间import datetimedatetime.datetime.now(){{ now|date:"Y-m-d H:i:s" }}

    • 模板继承

    • 模板继承使用extends标签实现。通过使用block来给子模板开放接口。

    • extends必须是模板中的第一个出现的标签。

    • 子模板中的所有内容,必须出现在父模板定义好的block中,否则django将不会渲染。

    • 如果出现重复代码,就应该考虑使用模板。尽可能多的定义block,方便子模板实现更细的需求。

    base.html
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    {% block js %}{% endblock js %}
    </head>
    <body>
    {% block content %}{% endblock content %}
    </body>
    </html>login.html{% extends "base.html" %}
    {% block content %}这是一个登录页面{% endblock %}
    
    • include另一个模板

    {% include "menu.html" %}

    • 注释标签

    • {#被注释的内容#}:将中间的内容注释掉。只能单行注释。

    • {% comment %}被注释的内容{% endcomment %}:可以多行注释。

    深入理解模板以及自定义过滤器

    • 自定义过滤器

    • DTL模板语言生来只是为了方便的展示信息,所以与编程语言相比显得有点薄弱,有时候不能满足我们的需求。因此django提供了一个接口,让开发者能自定义标签和过滤器。

    • 首先,你需要添加一个templatetags的文件夹, 自定义过滤器必须处在已经安装了的app中的一个名叫”templatetags”的包(文件夹)中。因此可以有两种选择:

    • 一种是放在其他已经安装了的app中。这种方式简单,但不方便管理。

    • 单独创建一个app,用来存放所有的自己定义的过滤器。

    比如,我们现在有一个account的app

    account

    ├── admin.py

    ├── apps.py

    ├── init.py

    ├── init.pyc

    ├── migrations

    │ └── init.py

    ├── models.py

    ├── templatetags

    │ ├── custom_tags.py

    │ └── init.py

    需要使用自定义过滤器,必须把对应的app加载,在settings中添加该app,假设我需要使用account下的自定义标签

    INSTALLED_APPS = [
    
    'django.contrib.admin',
    
    'django.contrib.auth',
    
    'django.contrib.contenttypes',
    
    'django.contrib.sessions',
    
    'django.contrib.messages',
    
    'django.contrib.staticfiles',
    
    'account'
    
    ]
    
    • 添加对应的自定义标签
    from django import template
    
    register = template.Library()   #代表此文件是自定义标签的包,register 不能作为更改,否则无法引用  过滤器
    
    @register.filter
    
    def mycut(value, args):
    
    return value.replace(args, "").lower()
    
    @register.simple_tag
    
    def xx():       #  可以加参数
    
    pass
    
    ps: register = template.Library()register的命名是固定的,不能修改
    
    • 在模版中使用
    
    {% extends "base.html" %}
    
    {% load custom_tags %}  # load + 文件名
    
    {% block content %}
    
    {{ name|mycut:" " }}
    
    {% endblock %}
    

    ps: 创建完templatetags模块后,你需要重启服务器。

    ps: 在模板中加载的是过滤器所在的文件名,而不是app的名称。

    ps: pycharm创建文件夹时,不会自动上传

    • 模板加载静态文件

    • 在项目添加一个静态文件夹,并添加需要添加的静态文件(一般名叫static)

    • 配置静态文件settings

    
    STATICFILES_DIRS = [
    
    os.path.join(BASE_DIR, "static")
    
    ]
    

    ps: 使用pycharm 创建完静态文件后,需要手动上传一次

    • 在需要使用的html模版头部中添加导入
    
    {% load static %}
    
    • 使用
    <script src="{% static '/js/jquery.min.js' %}"></script>
    
    • ps: 引入的路径是一个相对路径

    相关文章

      网友评论

        本文标题:深入理解Django静态文件以及模板详解

        本文链接:https://www.haomeiwen.com/subject/yovgcctx.html