如何在Django中使用静态文件和图片

363 阅读2分钟

现在我们要为我们一直在构建的帖子应用程序添加一些风格。Django对静态文件和图片的定位遵循惯例,就像它对大多数东西都有惯例一样。在Django中,你可以让静态文件在整个项目中共享,也可以在每个应用中共享。在本教程中,我们将在我们给定的应用程序中设置一个静态目录。然后我们将利用静态模板标签来使用应用程序中的静态文件,如CSS文件、图像文件和JavaScript文件。


staticfiles_dirs

你要做的第一件事是在 settings.py 中配置 STATICFILES_DIRS 常数。我们将把我们的静态文件和图片存储在一个名为static的目录中。因此,我们在settings.py文件的底部添加以下片段。

# 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')
]

STATIC_URL默认已经配置好了,但你确实需要手动添加STATICFILES_DIRS设置。

目录布局

在应用程序目录中,除了模板目录外,我们还可以添加一个静态目录。

django static files per app

请注意,在 **posts**文件夹中,有一个 **static**文件夹。在静态文件夹内,我们需要命名空间,就像我们对模板文件夹做的那样。所以我们可以在这个结构中放置我们的静态文件。

  • posts/static/posts

我们的模板使用这种结构定位。

  • posts/templates/posts

这是为了确保每次Django在不同的应用程序中搜索文件时,如果两个文件有相同的名字,它就会使用正确的文件。


设置一个基础模板

我们将再次使用Django模板继承法来设置一个名为base.html的基础模板。

posts/templates/posts/layout/base.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    {% load static %}
    <link rel="stylesheet" href="{% static "posts/css/bootstrap.min.css" %}">

    <title>Django Blog</title>
</head>
<body class="container mt-5">
{% block content %}

{% endblock content %}
</body>
</html>

在上面的片段中,我们正在使用静态模板标签来建立给定相对路径的URL。为了使用它,我们首先需要使用*{% load static %}加载它。从那里我们可以使用{% static "post/css/bootstrap.min.css" %}*来建立一个目标URL。


从Base.html扩展

我们的应用程序中已经有一个文件,显示系统中的博客文章列表。我们在Django Models教程中看到了这一点。现在我们要更新post_list.html文件,使其扩展我们刚才提到的base.html文件。

posts/templates/posts/post_list.html

{% extends "./layout/base.html" %}
{% load static %}

{% block content %}
    {% for post in posts %}
        <div class="card mb-4" style="width: 40rem">
            <img src="{% static 'posts/images/'|add:post.slug|add:'.jpeg' %}" class="card-img-top">
            <div class="card-body">
                <h3 class="card-title">{{ post.title }}</h3>
                <h6 class="card-subtitle mb-2 text-muted">{{ post.slug }}</h6>
                <p class="card-text">{{ post.snippet }}...</p>
            </div>
        </div>
    {% endfor %}
{% endblock content %}

通过使用*{% extends "./layout/base.html" %}*这行代码,我们现在利用了base.html的Html和包含的静态文件。我们还改变了post_list.html中的标记,以利用bootstrap类。这创造了一个相当不错的结果。

django blog list

Django静态文件和图片总结

我们可以在Django中使用静态文件和图片,使我们的应用程序对终端用户有更好的外观和感觉。