当前位置: 首页 > 知识库问答 >
问题:

Javascript代码在Django模板中使用模板继承无法工作

倪培
2023-03-14

我在Django项目中执行Javascript代码时遇到麻烦。

下面的操作很好--即不使用模板继承

HTML:

    <!DOCTYPE html>

    <html>

    <head>
    {% load static %}
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
    <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>

    <script src="{% static 'ads/test.js' %}" type="text/javascript"></script>

    <title> Test </title>

    </head>

    <body>

      <form action="{% url 'test' %}" method="post" id="my_form">
        {% csrf_token %}
        <button type="submit" class="btn btn-success">Submit</button>
      </form>

    </body>
   </html>

test.js

$(document).ready(function() {
$("#my_form").submit(function(){

alert('submitted');

});
});

由于上面的外部Javascript文件test.js已经成功执行,所以我假设静态url、静态DIR等的设置是正确的。还有,既然jquery已经起作用了,我假设先jquery再js代码的顺序也是正确的。

当我使用模板继承时,问题就来了。

基本HTML:

<!DOCTYPE html>
<html>

<head>

<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">

<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>

{% block scripts %}
{% endblock %}

<title> {% block title %}{% endblock %} </title>

</head>

<body>

{% block body %}
{% endblock %}

</body>
</html>

继承的模板:


{% extends "base.html" %}

{% block scripts %}
{% load static %}
<script src="{% static 'ads/test2.js' %}" type="text/javascript"></script>
{% endblock %}

{% block title %}
 Test
{% endblock %} 

{% block body %}
<form action="{% url 'test' %}" method="post" id="my_form">
    {% csrf_token %}
    <button type="submit" class="btn btn-success">Submit</button>
</form>
{% endblock %}

但是,上面的操作不起作用,即提交按钮时没有发生任何事情。唯一的改变是模板继承--没有它,js代码可以工作,但是如果包含它,就会出问题。

在chrome-inspect-network中,没有加载test.js文件,但可以看到bootstrap、popper、jquery js文件已经加载。Chrome控制台显示无错误

我扩展基模板或继承基模板的方式有问题吗?

共有1个答案

马野
2023-03-14

我认为您应该在扩展后在顶部加载static,而不是在block内部加载static。那么,试试这样的方法:

{% extends "base.html" %}
// My change
{% load static %}

{% block scripts %}
// Changed from
<script src="{% static 'ads/test2.js' %}" type="text/javascript"></script>
{% endblock %}

{% block title %}Test{% endblock %} 

{% block body %}
<form action="{% url 'test' %}" method="post" id="my_form">
    {% csrf_token %}
    <button type="submit" class="btn btn-success">Submit</button>
</form>
{% endblock %}

 类似资料:
  • Jinja 最为强大的地方在于他的模板继承功能,模板继承允许你创建一个基础的骨架模板, 这个模板包含您网站的通用元素,并且定义子模板可以重载的 blocks 。 听起来虽然复杂,但是其实非常初级。理解概念的最好方法就是通过例子。 基础模板 在这个叫做 layout.html 的模板中定义了一个简单的 HTML 文档骨架,你可以 将这个骨架用作一个简单的双栏页面。而子模板负责填充空白的 block:

  • 模板继承可以减少页面内容的重复定义,实现页面内容的重用 典型应用:网站的头部、尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义 block标签:在父模板中预留区域,在子模板中填充 extends继承:继承,写在模板文件的第一行 定义父模板base.html { % block block_name % } 这里可以定义默认值 如果不定义默认值,则表示空字符串 { %

  • Jade 支持通过 block 和 extends 关键字来实现模板继承。 一个块就是一个Jade的"block" ,它将在子模板中实现,同时是支持递归的。 Jade 块如果没有内容,Jade会添加默认内容,下面的代码默认会输出block scripts, block content, 和 block foot. html head h1 My Site - #{title}

  • 继承 继承能够创建可复用的模板,定义页面的骨架,然后被子模板填充,子模板又可以作为父模板被继承。 继承主要通过两个标签语法实现 <t:template> 定义要继承的父模板 <b:block> 在父模板中用来定义可以被填充的区域;在子模板中用来定义将内容填充到父模板的指定区域 定义父模板 layout.vdt <div> <b:header> <div>父模板头部</div> </

  • 模板继承是 ThinkCMF推荐一种布局方式,它比上一篇讲的模板布局更灵活;模板继承就是你先定义一个基础的模板,在这个基础模板你可以设置很多个区块( block),然后在其它实际要渲染的子模板文件中用 extend标签继承这个基础模板,在子模板中定义name相同的 block,这样就可以对基础模板中定义的区块进行重载; 每个区块都是<block></block>这样的标签,如: <block na

  • 模板继承是 ThinkCMF推荐一种布局方式,它比上一篇讲的模板布局更灵活;模板继承就是你先定义一个基础的模板,在这个基础模板你可以设置很多个区块( block),然后在其它实际要渲染的子模板文件中用 extend标签继承这个基础模板,在子模板中定义name相同的 block,这样就可以对基础模板中定义的区块进行重载; 每个区块都是<block></block>这样的标签,如: <block na