模板层

121 阅读10分钟

各种标签详解

URL 标签

{% url %} 标签是 Django 模板系统中的一个内置标签,用于生成指向指定 URL 的链接。它的基本语法是:

{% url 'path.to.some_view' arg1=v1 arg2=v2 %}

其中 'path.to.some_view' 是视图函数的 URLconf 路径,后面可以跟一些参数值

你可以使用以下方式在 Django 模板中传递 URL 参数:

{% url 'url_name' type='parameter' %}

其中,url_name 是你想要生成 URL 的视图函数的名称,type 是视图函数中接收的参数名,parameter 是你想要传递的值。

在你的情况下,可以这样写:

{% url 'your_view_function_name' type='unstudy' %}

或者,如果你需要动态地传递参数,你可以使用变量名代替具体的值,例如:

{% url 'your_view_function_name' type=your_variable_name %}

这将根据你在视图中定义的变量来生成 URL。

{% url %} 标签还支持以下两种语法:

  • name 参数语法:

    {% url 'name' arg1 v2 %}
    

    其中 'name' 是一个在 urls.py 文件中定义的 URL 名称,而不是视图函数的名称。 Django 会根据定义的 URL 名称自动匹配对应的视图函数,并使用传递的参数来生成 URL。

  • view 参数语法:

    {% url 'view_name' arg1 v2 %}
    

    其中 'view_name' 是一个视图函数的名称,而不是 URLConf 文件中的 URL 名称。 Django 会自动在 URLConf 文件中查找与该视图函数匹配的 URL,并使用传递的参数来生成 URL。

下面是一个具体的例子:

假设在 urls.py 中定义了如下 URLConf

from django.urls import path
from . import views

urlpatterns = [
    path('book/<int:pk>/', views.BookDetailView.as_view(), name='book_detail'),
]

那么在模板中,你就可以使用 {% url %} 标签来生成指向这个 URL 的链接:

<a href="{% url 'book_detail' pk=book.id %}">{{ book.title }}</a>

在这个例子中,{% url 'book_detail' pk=book.id %} 标签生成的链接指向 views.BookDetailView 视图,并且传递了一个 pk 参数,这个参数的值是当前书籍的 id 属性。

总之,{% url %} 标签是 Django 提供的一种方便的方式,可以让你从模板中快速生成指向指定 URL 的链接,而无需手动构建 URL。

模板扩展标签

Django 中提供了多个扩展标签库,其中常用的包括 statici18nsimpletags。下面是对它们的介绍:

  1. static

    static 标签库用于在模板中引用静态文件(如 CSS、JS 或图像文件)。它提供了两个标签:{% load static %}{% static 'path/to/file.ext' %}

    在模板开头使用 {% load static %} 加载该标签库,然后可以在模板中使用 {% static 'path/to/file.ext' %} 标签引用静态文件。Django 将会为你自动解析可用的静态文件路径,并生成正确的 URL。

  2. i18n

    i18n 标签库提供了有关国际化的标签和过滤器。它包括诸如 {% trans %}{% blocktrans %}{% get_current_language %}{% language %} 等标签和过滤器。这些标签可以帮助你轻松地在 Django 应用程序中实现多语言支持。

    在模板开头使用 {% load i18n %} 加载该标签库,然后就可以在模板中使用这些标签了。

  3. simpletags

    simpletags 标签库允许你自定义简单的标签。你可以创建自己的标签,然后在需要时在模板中使用它们。

    要创建一个简单的标签,需要创建一个 python 模块,然后在其中定义一个自定义标签。然后可以通过在模板中加载该标签库来使用标签。

以上是常用的扩展标签库的介绍,当你需要在 Django 的模板中使用一些额外的标签或过滤器时,为了更好地扩展 Django,可以考虑编写和使用自定义标签库。

资源加载 (static、meida)

static 静态资源加载

在Django设置中正确配置STATIC_URL和STATIC_ROOT。

以下是一些步骤:

  1. 打开settings.py文件并确保其中包含以下代码:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static') # 收集静态资源目录  
#STATICFILES_DIRS = [
#    os.path.join(BASE_DIR, 'static'),  # 索引目录
#]

这些设置表示您的静态文件将从名为'static'的目录中提供,并且该目录位于与项目的根目录相同的级别上。

  1. 确保您的静态文件位于项目结构中的'static'目录中。例如,如果您的项目名称为'myproject',则应该在'myproject/static'目录下找到您的'banner.png'文件。

  2. 运行以下命令以收集静态文件(注意收集的时候需要STATIC_ROOT,索引的时候需要注释掉:

python manage.py collectstatic

这将把您的所有静态文件从各个位置复制到STATIC_ROOT指定的目录。

  1. 最后,在您的模板中使用以下代码来引用静态文件:
{% load static %}
<img src="{% static 'banner.png' %}" alt="Banner">

这将生成一个URL,该URL指向您在STATIC_ROOT中定义的路径。

  1. 在 Django 项目的 urls.py 中添加 static() 视图以提供静态文件服务。

    例如,在 urls.py 文件中添加以下代码:

    from django.conf import settings
    from django.conf.urls.static import static
    
    urlpatterns = [
        # ... 其他视图URL配置 ...
    ]
    
    # 添加静态文件URL配置
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    

    添加这些 URL 配置后,你的项目就可以使用 static 标签库来引用静态文件了。例如,在模板中使用 {% static 'path/to/file.ext' %} 这个标签就可以生成静态文件的 URL。注意,path/to/file.ext 是相对于 STATIC_ROOT 路径的相对路径,即相对于 staticfiles 文件夹。

最后,确保你的静态文件被正确收集到了 STATIC_ROOT 目录中,就可以使用 {% static 'path/to/file.ext' %} 标签来引用静态文件了。

media资源加载

不同的导入方法

re_path(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT}, name='static'),
re_path(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}, name='media'), # 试图函数是serve服务(文件系统),并传参数对于media文件目录
static(settings.STATIC_URL, document_root=settings.STATIC_ROOT),

对于这两种路径导入方法的比较,可以从以下几个方面进行分析:

  1. 导入方法

    from django.views.static import serve 是从 views 模块中导入 serve 函数,它是 Django 内置视图函数之一,用于提供静态文件服务。而 from django.conf.urls.static import static 是从 urls 模块中导入 static() 函数,它是 Django 内置视图函数集合之一,用于提供应用程序静态文件服务。

  2. 功能

    serve 函数用于提供静态文件服务,主要是用于显示用户上传的媒体文件,例如图片、音频或视频等。而 static() 函数则主要用于提供应用程序静态文件服务,例如 CSS、JavaScript 和图片等文件。

  3. 使用场景

    serve 函数通常用于在 Django 项目中提供用户上传的媒体文件,一般用于开发项目的时候,可以快速测试上传文件的功能。而 static() 函数则用于为应用程序服务中的静态文件提供 URL,以便在浏览器中访问这些文件。

综上所述,两种路径导入方法的主要区别在功能和使用场景上。serve 函数用于提供用户上传的媒体文件服务,而 static() 函数则用于提供应用程序静态文件服务。

实现和效果上的区别如下:

  1. 实现

    serve 函数和 static() 函数在实现上有些不同。serve 函数实现了一个基于文件系统的简单文件服务器,用于提供静态文件服务。而 static() 函数是一个装饰器,它可以将静态文件目录添加到 URL 配置中,并返回一个可用于处理请求的 view 函数。

  2. 效果

    所提供的服务也有一些不同之处。serve 函数用于提供用户上传的媒体文件,例如图片、音频或视频等。而 static() 函数则用于为应用程序服务中的静态文件提供 URL,以便在浏览器中访问这些文件。它们提供的静态文件服务对象不同,且适合不同的文件类型和应用场景。serve 函数是专门用于提供文件服务的视图函数之一,用于显示用户上传的媒体文件,例如图片、音频或视频等。而 static() 函数在内部使用了 serve 函数来提供静态文件服务,但由于其是一个工厂函数,因此可以将多个静态文件目录添加到 URL 配置中。

总的来说,两种方式提供的静态文件服务功能大体相同,都是用于提供静态文件的访问和服务。主要差异在于使用场景、适用文件类型和实现方式等方面。serve 函数在用户上传文件的场景中比较适用,而 static() 函数则更常用于为应用程序静态文件提供 URL 的场景中。

一些常见问题

  • 为什么我修改了static下的图片源文件,换成了新图片,名字没变,但是显示的却还是之前的图片?

这很有可能是浏览器缓存导致的问题。通常情况下,当您访问一个网页时,浏览器会将该网页的一些资源(如图片、CSS样式表等)缓存在本地,以便在您再次访问该网页时能够更快地加载资源。

如果您已经修改了static目录下的图片源文件,但仍然看到之前的图片,可以尝试以下几种方法:

  1. 清除浏览器缓存:在浏览器中按下Ctrl + Shift + Delete组合键,选择清除缓存选项,然后重新加载网页。(实测有效!

  2. 在图片的URL地址后面加上随机参数:例如,将原来的图片URL地址从"example.com/images/imag…

    在图片URL地址后面加上随机参数的方法,其实是利用缓存的原理来达到更新图片的目的

    当浏览器加载一个网页时,它会自动将该网页的一些资源(如图片、CSS样式表等)缓存在本地,以便在您再次访问该网页时能够更快地加载资源。这些资源通常会被浏览器缓存一段时间,如果您对资源进行了修改,但是浏览器仍然使用旧版本的资源,就可能会导致显示错误的内容

    为了避免浏览器使用缓存中的旧版本资源,我们可以在资源URL地址后面添加一个随机参数或者时间戳,这样每次访问该资源时,浏览器都会认为它是一个新的资源,从而强制重新下载该资源并更新缓存。

    例如,将原来的图片URL地址从"example.com/images/imag…

  3. 重命名图片文件:如果您确定已经修改了图片源文件,并且使用了正确的文件名,那么您可以尝试将该文件重命名为其他名称,保存并重新加载网页。(局限性,原理应该和上面一样)

希望这些方法能够帮助您解决问题。

各种报错页面配置(404)

Django中404等错误页面的模板文件可以通过配置来指定。你需要在Django的设置文件(settings.py)中添加以下代码(指定对应的报错解决代码,否则定义了无法生效):

# 指定404错误页面的模板文件
handler404 = 'yourapp.views.handler404'

# 指定500错误页面的模板文件
handler500 = 'yourapp.views.handler500'

其中,'yourapp.views.handler404''yourapp.views.handler500'分别是处理404和500错误的视图函数的路径。你需要创建这两个视图函数,并在其内部渲染对应的模板文件。

例如,可以在yourapp/views.py文件中定义如下的视图函数:

from django.shortcuts import render

def handler404(request, exception):
    return render(request, '404.html', status=404)

def handler500(request):
    return render(request, '500.html', status=500)

这里使用了Django内置的render函数来渲染404.html和500.html模板文件,并且将状态码作为参数传递给render函数。