首页 > 解决方案 > Django 3.1 有条件加载静态的最佳方法

问题描述

我是 django 的新手,目前正试图找到一种有效的方法来根据当前页面以 django 模板语言加载 css 文件。网址模式是:

path('invoices/', views.list, name='invoice_list'),
path('invoices/new/', views.create, name='create_invoice'),
path('invoices/<int:pk>/', views.edit, name='edit_invoice'),
path('invoices/<int:pk>/lines/new', views.create_line, name='create_line'),
path('invoices/<int:pk>/lines/<int:fk>', views.update_line, name='update_line'),

在 base.html 中,这就是我正在做的事情:

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="{% static 'invoice/css/common.css' %}">
    {% if request.path == '/invoices/'%}
       <link rel="stylesheet" href="{% static 'invoice/css/invoice_list.css' %}">
    {% endif %}
    {% if '/invoices/' in request.path and request.path != '/invoices/' and '/line/' not in request.path %}
       <link rel="stylesheet" href="{% static 'invoice/css/edit_invoice.css' %}">
    {% endif %}
    <title>My invoices </title>
  </head>

一点都不好, {% if '/invoices/' in request.path and request.path != '/invoices/' and '/line/' not in request.path %}想知道是否有更好的方法来实现正则表达式样式?提前致谢。

标签: djangodjango-templates

解决方案


你不应该把这样的逻辑放在模板中。相反,您应该为此目的使用blockand模板标签。extends请参阅模板继承 [Django 文档]

base.html

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="{% static 'invoice/css/common.css' %}">
    {% block extra_css %}
    {% endblock extra_css %}
    <title>My invoices </title>
  </head>

现在在if request.path == '/invoices/'为真时呈现的模板中,您将将此块填充为:

{% extends "base.html" %}
...
{% block extra_css %}
    <link rel="stylesheet" href="{% static 'invoice/css/invoice_list.css' %}">
{% endblock extra_css %}

类似地,在if '/invoices/' in request.path and request.path != '/invoices/' and '/line/' not in request.path为 true 时呈现的模板中,您将块填充为:

{% extends "base.html" %}
...
{% block extra_css %}
    <link rel="stylesheet" href="{% static 'invoice/css/edit_invoice.css' %}">
{% endblock extra_css %}

推荐阅读