You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django模板中script.js的.testimonial-slider函数无法执行求助

Django中Slick轮播初始化失败的问题排查与解决

问题描述

我正在学习Django,尝试给首页适配Bootstrap模板,当前代码结构如下,遇到的问题是:script.js中初始化Slick轮播的$('.testimonial-slider').slick()函数无法执行,但把这段代码放到testimonial.html里就能正常运行。


当前代码结构

home.html(基础模板)

{% load static %}

<!DOCTYPE html>
<!--
This is a starter template page. Use this page to start your new project from
scratch. This page gets rid of all links and provides the needed markup only.
-->
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>{{title}}</title>
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
  <link rel="stylesheet" href="{% static 'lib/AdminLTE-3.2.0/plugins/fontawesome-free-6.4.0/css/all.min.css' %}">
  <link rel="stylesheet" href="{% static 'lib/AdminLTE-3.2.0/css/adminlte.min.css' %}">
  <script src="{% static 'lib/AdminLTE-3.2.0/plugins/jquery/jquery.min.js' %}"></script>
  <script src="{% static 'lib/AdminLTE-3.2.0/plugins/bootstrap/js/bootstrap.min.js' %}"></script>
  <script src="{% static 'lib/AdminLTE-3.2.0/js/adminlte.min.js' %}"></script>
  <script src="{% static 'lib/sweetalert2-9.10.0/sweetalert2.all.min.js' %}"></script>
  <script src="{% static 'js/functions.js' %}"></script>
  {% block head %}
  {% endblock %}
</head>
{% block body %}
{% endblock %}
</html>

index.html(继承基础模板)

{% extends 'home.html' %}

{% load static %}

{% block head %}
<link rel="shortcut icon" type="image/x-icon" href="{% static 'homepage/images/favicon.png' %}" />
<link rel="stylesheet" href="{% static 'homepage/plugins/themefisher-font/style.css' %}">
<link rel="stylesheet" href="{% static 'homepage/plugins/bootstrap/bootstrap.min.css' %}">
<link rel="stylesheet" href="{% static 'homepage/plugins/lightbox2/css/lightbox.min.css' %}">
<link rel="stylesheet" href="{% static 'homepage/plugins/animate/animate.css' %}">
<link rel="stylesheet" href="{% static 'homepage/plugins/slick/slick.css' %}">
<link rel="stylesheet" href="{% static 'homepage/css/style.css' %}">
<script src="{% static 'homepage/plugins/jquery/jquery.min.js' %}"></script>
<script src="{% static 'homepage/plugins/parallax/jquery.parallax-1.1.3.js' %}"></script>
<script src="{% static 'homepage/plugins/lightbox2/js/lightbox.min.js' %}"></script>
<script src="{% static 'homepage/plugins/slick/slick.min.js' %}"></script>
<script src="{% static 'homepage/plugins/filterizr/jquery.filterizr.min.js' %}"></script>
<script src="{% static 'homepage/plugins/smooth-scroll/smooth-scroll.min.js' %}"></script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCcABaamniA6OL5YvYSpB3pFMNrXwXnLwU"></script>
<script src="{% static 'homepage/plugins/google-map/gmap.js' %}"></script>
<script src="{% static 'homepage/js/script.js' %}"></script>
{% endblock %}
{% block body %}
<body id="body">
  <div id="preloader">
    <div class='preloader'>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
    </div>
  </div>
{% include 'header.html' %}
{% include 'principal.html' %}
<!-- 省略部分页面代码 -->
{% include 'testimonial.html' %}
{% include 'blog.html' %}
{% include 'footer.html' %}
</body>
{% endblock %}

testimonial.html(轮播片段)

{% load static %}
{% block head %}
{% endblock %}
<section class="testimonial section" id="testimonial">
    <div class="container">
        <div class="row">
            <div class="col-lg-12">
                <div class="testimonial-slider">
                    <!-- 轮播项 -->
                    <div class="item text-center">
                        <i class="tf-ion-chatbubbles"></i>
                        <div class="client-details">
                            <p>Lorem ipsum dolor sit amet...</p>
                        </div>
                        <div class="client-thumb">
                            <img loading="lazy" src="{% static 'homepage/images/client-logo/clients-1.jpg' %}" class="img-fluid" alt="">
                        </div>
                        <div class="client-meta">
                            <h3>William Martin</h3>
                            <span>CEO , Company Name</span>
                        </div>
                    </div>
                    <!-- 省略其他轮播项 -->
                </div>
            </div>
        </div>
    </div>
</section>

homepage/js/script.js(问题函数)

(function ($) {
  'use strict';
  // 省略其他代码
  /*BELOW IS THE PROBLEM!!!!!!!!!!!!!!!!*/
  $('.testimonial-slider').slick({
    infinite: true,
    arrows: false,
    autoplay: true,
    autoplaySpeed: 2000
  });
  // 省略其他代码
})(jQuery);

原因分析

  • DOM加载顺序错误:你在index.html的head区块里加载了script.js,此时页面的DOM元素(包括.testimonial-slider)还没渲染生成。JS代码执行时找不到目标元素,初始化自然失败。而把代码放到testimonial.html里,代码是在DOM元素之后加载的,此时元素已经存在,所以能正常执行。
  • jQuery重复加载冲突:home.html的head中已经加载了一次jQuery,index.html的head又重复加载了一次,这会覆盖jQuery的上下文环境,可能导致Slick插件无法正确绑定到jQuery对象上。

解决方法

1. 调整JS文件的加载位置

把index.html中head区块里的所有JS文件,移到body区块的末尾(所有HTML内容之后),确保DOM完全渲染后再加载执行JS代码:

{% extends 'home.html' %}
{% load static %}

{% block head %}
<!-- 只保留CSS和图标链接,移除所有JS -->
<link rel="shortcut icon" type="image/x-icon" href="{% static 'homepage/images/favicon.png' %}" />
<link rel="stylesheet" href="{% static 'homepage/plugins/themefisher-font/style.css' %}">
<link rel="stylesheet" href="{% static 'homepage/plugins/bootstrap/bootstrap.min.css' %}">
<link rel="stylesheet" href="{% static 'homepage/plugins/lightbox2/css/lightbox.min.css' %}">
<link rel="stylesheet" href="{% static 'homepage/plugins/animate/animate.css' %}">
<link rel="stylesheet" href="{% static 'homepage/plugins/slick/slick.css' %}">
<link rel="stylesheet" href="{% static 'homepage/css/style.css' %}">
{% endblock %}

{% block body %}
<body id="body">
  <div id="preloader">...</div>
  {% include 'header.html' %}
  {% include 'principal.html' %}
  {% include 'testimonial.html' %}
  {% include 'blog.html' %}
  {% include 'footer.html' %}

  <!-- JS文件移到此处,DOM渲染完成后再加载 -->
  <script src="{% static 'homepage/plugins/parallax/jquery.parallax-1.1.3.js' %}"></script>
  <script src="{% static 'homepage/plugins/lightbox2/js/lightbox.min.js' %}"></script>
  <script src="{% static 'homepage/plugins/slick/slick.min.js' %}"></script>
  <script src="{% static 'homepage/plugins/filterizr/jquery.filterizr.min.js' %}"></script>
  <script src="{% static 'homepage/plugins/smooth-scroll/smooth-scroll.min.js' %}"></script>
  <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCcABaamniA6OL5YvYSpB3pFMNrXwXnLwU"></script>
  <script src="{% static 'homepage/plugins/google-map/gmap.js' %}"></script>
  <script src="{% static 'homepage/js/script.js' %}"></script>
</body>
{% endblock %}

2. 移除重复的jQuery加载

删除index.html中的<script src="{% static 'homepage/plugins/jquery/jquery.min.js' %}"></script>,保留home.html里的jQuery引用(因为AdminLTE依赖它),避免重复加载导致的上下文冲突。

3. 可选:用DOM就绪事件包裹初始化代码

如果不想调整JS加载位置,也可以在script.js中把轮播初始化代码放到jQuery的$(document).ready()事件里,确保DOM完全加载后再执行:

(function ($) {
  'use strict';
  // 省略其他代码
  $(document).ready(function() {
    $('.testimonial-slider').slick({
      infinite: true,
      arrows: false,
      autoplay: true,
      autoplaySpeed: 2000
    });
  });
  // 省略其他代码
})(jQuery);

内容的提问来源于stack exchange,提问作者Joe R.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 15:34:53