zoukankan      html  css  js  c++  java
  • django之模板路径配置、模板变量、过滤器、静态文件配置、标签与自定义标签

    一、模板路径配置

      1.在项目中创建templates文件夹存放模板文件

      2.修改settings.py文件

    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',
                ],
            },
        },
    ]

      3.使用模板文件

    def show_article(request):
        articles = {}
        article_list = []
        for i in range(30):
            dt = datetime.datetime.now() - datetime.timedelta(days=random.randint(0, 100))
            article_list.append((dt, "python 函数返回多个值"))
        article_list = sorted(article_list, key=lambda ele: ele[0])
        article_list.reverse()
        for article in article_list:
            d = article[0].strftime("%Y-%m")
            if not articles.get(d, None):
                articles[d] = []
            articles[d].append(article)
    
        return render(request, 'article/show-article.html', context={"articles": articles})

    上述代码中的模板路径表示在templates目录下存在article目录下的show-article.html文件,一般会在templates下创建与每个应用名相同的文件夹,用于存放该应用的模板。

      4.模板配置的两种方式

        第一种:DIRS 定义一个目录列表,模板引擎按列表顺序搜索这些目录以查找模板源文件,将templates放在主项目目录下。

        前3步使用了第一种方式,这种方式是常用方式。

        第二种:APP_DIRS告诉模板引擎是否应该进入每个已安装的应用中查找模板,值为True则模板会去安装了的app下面的templates文件夹查找模板,所以我们也可以在每个app的里面创建模板目录templates存放模板,这种方式需要将这个app添加到setting.py文件的INSTALLED_APPS列表中。

    二、模板变量

      1.使用规则

        语法: {{ 变量名 }};

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

        可以使用字典、模型、方法、函数、列表,方法和函数不能带括号;

        不要和python或django关键字重名;

        变量和查找;

      2.注意的地方

        如果data是一个字典,那么访问data.items将会访问data这个字典的key名为items的值,而不会访问字典的items方法。

        点在模板渲染时有特殊的含义。 变量名中点表示查找。

    三、过滤器

      1.语法:

        {{fruits|lower}} 不带参数的过滤器

        {{fruits|cut:''}} 带参数的过滤器(使用参数的时候,冒号和参数之间不能有任何空格,一定要紧挨着。

        {fruits|lower|capfirst} 多重过滤器

      2.常用过滤器

        

       3.date和time过滤器格式(这两个过滤器过滤的值必须是datetime格式,不能是字符串

        

       4.使用示例

        

         

    四、静态文件配置

      1.在主项目目录下创建static文件夹

      2.修改settings.py(添加STATICFILES_DIRS变量)

    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/3.0/howto/static-files/
    
    STATIC_URL = '/static/'
    
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, "static"),
    ]

      3.使用静态文件的方式(静态文件包括css文件、js文件、图片、字体文件等)

    {% load static %}
    <link rel="stylesheet" href="{% static 'css/show-article.css' %}">

      使用前需要加载,也可以不用加载,但是必须在settingspy文件中进行配置

    加载不配置:

    {% load static %}

    配置不加载(如下配置后就不用了加载了)

    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',
                ],
            'builtins': ['django.templatetags.static'],
    }, }, ]

      引用的方式

    <link rel="stylesheet" href="{% static 'css/index.css' %}" />

    五、标签

      1.语法:由%}和 {% 来定义的,例如:{%tag%} {%endtag%}

      2.作用:如果说模板变量相当于变量,那么标签就是控制结构。

      3.常用的标签(注:forloop.counter、forloop.counter0等是变量)

        

      4.标签示例:(继承模板的标签{% extends ''%}必须放在模板文件的最前面

    <!--if-->
    {% if  name == "python" %}
    这个是python的页面
    {% elif name == "Java" %}
    这个是Java的页面
    {% else %}
    这个是{{name}}的页面
    {% endif %}
    
    <!--for-->
    <ul>
            {% for title in titles %}
             <li>{{title}}</li>
             {% endfor %}  
    </ul>
    
    <!--url:一般配合视图的名称来-->
    <!--
        urlpatterns = [
            path('admin/', admin.site.urls),
            path('', views.index, name='index'),
            path('user/', include("User.urls")),
            path('article/', include("Article.urls")),
            path('collection/', include("Collection.urls")),
            path('getcode/', views.send_code, name='code')
        ]
    -->
    <a hre="{% url 'index' %}">首页</a>
    
    <!--with-->
    {% with test_name as tn %}
    {{tn}}
    {% endwith %}
    
    <!--autoescape-->
    原始的:{{html}}
    过滤器方式: {{ html | safe }}
    标签方式
    {% autoescape off %}
        {{ html }}
    {% endautoescape %}

    六、自定义标签

      1.自定义过滤器、标签路径配置

        模板是放在主目录下的templates文件夹中,而自定义过滤器、标签是放在templatetags包下面。

        第一步:在主目录下创建一个名为common的Python包

        第二步:将commom这个包注册到settings.py的INSTALLED_APP变量中

        第三步:在common包中创建templatetags包

        第四步:在templatetags包中创建一个extra.py用于存放自定义过滤器和标签的模块(注意:templatetags这个包名是固定的,里面的模块名是自定义的)

        第五步:在extra.py中编写自定义过滤器和模块的代码(注意:要遵守自定义的规则)

      2.自定义过滤器

        分析:过滤器过滤的对象可以看做是过滤器的第一个参数,如果过滤器后面还要跟参数就是两个参数,所以我们可以得出过滤器就是一个带有一个或两个参数的Python 函数

    from django import template
    
    
    register = template.Library()
    
    
    # 自定义cut过滤器
    # cut过滤器后面必须要跟一个参数,所以有两个参数
    @register.filter
    def self_cut(value, arg):
        if isinstance(value, (str, )):
            return value.replace(arg, "")
        else:
            return value
    
    
    # 自定义字母大写过滤器
    # 字母大写过滤前面的值,不用再加另外的参数,所以有一个参数
    @register.filter
    def self_upper(value):
        if isinstance(value, (str, )) and value.isalpha():
            return value.upper()
        else:
            return value
    
    
    # 分析Library.filter(self, name=None, filter_func=None, **flags)参数
    # name表示过滤器的名称,如果没有给,就默认为函数名
    # filter_func就是你编写的函数名

      3.自定义标签

        3.1自定义标签种类:

          简单标签:django.template.Library.simple_tag()

          包含标签:django.template.Library.inclusion_tag()

        3.2分析:自定义简单标签可以没有参数,一个参数或者是使用context中存在的参数,注意如果使用context中存在的参数必须保证传的context有这个参数

    自定义简单标签

    from django import template
    import datetime
    
    register = template.Library()
    
    
    # 参数分析
    # Library.simple_tag(self, func=None, takes_context=None, name=None)
    # 参数分析:func:标签函数 takes_context:是否使用context name:定制标签名
    
    # 自定义一个显示当前时间的标签
    # 无参数
    @register.simple_tag
    def now():
        return datetime.datetime.now()
    
    
    # 自定义一个显示当前时间的标签,且这个标签可以接受格式化时间参数
    # 一个参数
    @register.simple_tag
    def now(format_string):
        return datetime.datetime.now().strftime(format_string)
    
    
    # 使用context作为参数
    # 还需要将Library.simple_tag(self, func=None, takes_context=None, name=None)中take_context设置为True
    @register.simple_tag(takes_context=True)
    def now(context):
        format_string = context.get("format_string", None)
        if format_string:
            return datetime.datetime.now().strftime(format_string)
        else:
            return None

    自定义包含标签:通过将自定义包含标签函数的返回值(字典)渲染到指定的模板中,从而使用包含标签时,显示渲染的模板,可以通过查询数据库获取渲染数据。

    下面的代码本来是写在HTML页面中的,通过context渲染,现在我把它抽出来,专门作为一个自定义包含标签:

    <ul class="list-group">
            {% for k, list in articles.items %}
                <li class="list-group-item list-group-item-success"><h4>{{ k }}</h4></li>
                <ul id="article-list">
                    {% for a in list %}
                        <li class="text-info"><h5>{{ a.0 | date:"m-d" }}&nbsp;{{ a.1 }}</h5></li>
                    {% endfor %}
                </ul>
            {% endfor %}
    </ul>

    from django import template
    import datetime
    import random
    
    register = template.Library()
    
    
    @register.inclusion_tag(filename="include/show_article.html")
    def show_article():
        articles = {}
        article_list = []
        for i in range(30):
            dt = datetime.datetime.now() - datetime.timedelta(days=random.randint(0, 100))
            article_list.append((dt, "python 函数返回多个值"))
        article_list = sorted(article_list, key=lambda ele: ele[0])
        article_list.reverse()
        for article in article_list:
            d = article[0].strftime("%Y-%m")
            if not articles.get(d, None):
                articles[d] = []
            articles[d].append(article)
        return {"articles": articles}
    {% extends 'base/base-no-main-left.html' %}
    {# 使用前必须先加载static #}
    {% load static %}
    {% load extra %}
    {% block link %}
        <link rel="stylesheet" href="{% static 'css/show-article.css' %}">
    {% endblock %}
    {% block main-left %}
        {% show_article %}
    {% endblock %}

      4.自定义过滤器、标签的使用

        当自定义过滤器和标签编写好后,就可以使用了;在模板中使用,必须要加载自定义过滤器、标签所在的模块,上述标签、过滤器是在extra.py文件中,且路径配置无误,

    那么就可以加载使用

    {% extends 'base/base-no-main-left.html' %}
    {# 使用前必须先加载static #}
    {% load static %}
    {% load extra %}
    {% block link %}
        <link rel="stylesheet" href="{% static 'css/show-article.css' %}">
    {% endblock %}
    {% block main-left %}
        {% show_article %}
    {% endblock %}
  • 相关阅读:
    homebrew
    Flutter状态管理之provide和provider的使用区别
    Flutter Bloc状态管理 简单上手
    Flutter 路由传入中文参数报错无法push问题
    Flutter 一些常用第三方库、插件
    js替换字符串中的空格,换行符 或 替换成<br>
    Flutter状态管理Provider,简单上手
    Flutter Resolving dependencies...很慢解决办法
    Flutter布局--appbar导航栏和状态栏
    Flutter运行报错 `kernel_snapshot for errors` 解决方案
  • 原文地址:https://www.cnblogs.com/loveprogramme/p/12450492.html
Copyright © 2011-2022 走看看