【问题标题】:Best practice for including custom javascript in Django?在 Django 中包含自定义 javascript 的最佳实践?
【发布时间】:2017-03-10 14:02:01
【问题描述】:

对于 Django 来说还是新手。我正在尝试将日历小部件合并到date 输入中,如tutorial 所示。以下 test.html 工作正常:

{% extends "base_alt_simple.html" %} # note this has {% load static %}

{% block title %}Schedule{% endblock %}

{% block main_content %}

<div class="container">

  <h3>Building name</h3>

</div>

<div class="container">
<div class="bootstrap-iso">
 <div class="container-fluid">
  <div class="row">
   <div class="col-md-6 col-sm-6 col-xs-12">
    <form method="post">
     <div class="form-group ">
      <label class="control-label " for="date">
       Date
      </label>
      <div class="input-group">
       <div class="input-group-addon">
        <i class="fa fa-calendar">
        </i>
       </div>
       <input class="form-control" id="date" name="date" placeholder="MM/DD/YYYY" type="text"/>
      </div>
     </div>
     <div class="form-group">
      <div>
       <button class="btn btn-primary " name="submit" type="submit">
        Submit
       </button>
      </div>
     </div>
    </form>
   </div>
  </div>
 </div>
</div>
</div>
<script>
    $(document).ready(function(){
        var date_input=$('input[name="date"]'); //our date input has the name "date"
        var container=$('.bootstrap-iso form').length>0 ? $('.bootstrap-iso form').parent() : "body";
        date_input.datepicker({
            format: 'mm/dd/yyyy',
            container: container,
            todayHighlight: true,
            autoclose: true,
        })
    })
</script>

但是,如果我想将 javascript 保留在 custom.js 中,我将如何加载它?

使用我使用的初始答案:

<script src="{% static 'custom.js' %}"></script>

但日历弹出不再有效。我在这里显然误解了如何引入custom.js 功能。感谢您的任何建议。

另外,base_alt_simple.html

{% load staticfiles %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

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

    <!-- Bootstrap core CSS -->
    <link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet">

    <!-- Custom Fonts -->
    <link href="{% static 'css/font-awesome.min.css' %}" rel="stylesheet" type="text/css">
    <link href="https://fonts.googleapis.com/css?family=Lora" rel="stylesheet" type="text/css">
    <link href="https://fonts.googleapis.com/css?family=Montserrat:400,700" rel="stylesheet" type="text/css">
    <link href="https://fonts.googleapis.com/css?family=Abril+Fatface" rel="stylesheet">

    <!-- Custom CSS -->
    <link href="{% static 'css/grayscale.min.css' %}" rel="stylesheet">
    <link href="{% static 'css/custom.css' %}" rel="stylesheet">

    <!-- favicon -->
    <link rel="shortcut icon" href="{%  static 'images/favicon.ico' %}">



    <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
        <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
        <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->

</head>

<body id="page-top" data-spy="scroll" data-target=".navbar-fixed-top">

<!-- Static navbar -->
<nav class="navbar navbar-default navbar-static-top" style="background-color: #FFFFFF;">
  <div class="container">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand page-scroll" href="{% url 'index' %}">
        <img id="logo" src="{% static 'images/Logo1.png' %}">
      </a>
    </div>
    <div id="navbar" class="navbar-collapse collapse">
      <!-- <ul class="nav navbar-nav navbar-right"> -->
      <form method='GET' action='' class="nav navbar-nav navbar-right">
        <input type='text' name='q' placeholder='Search apartments' value='{{ request.GET.q }}'/>
        <input type='submit' value='Search' />
      </form>
        <!-- <li><a href="#">User <span class="glyphicon glyphicon-user" id="logIcon"></span></a></li> -->
        <!-- <li><a href="#"> <span class="glyphicon glyphicon-home" id="logIcon"></span></a></li> -->
      <!-- </ul> -->
    </div><!--/.nav-collapse -->
  </div>
</nav>

{% block main_content %}

{% endblock %}


    <!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
<script src="{% static 'bootstrap.min.js' %}"></script>
<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
<script src="{% static 'ie10-viewport-bug-workaround.js' %}"></script>

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
<link rel="stylesheet" type="text/css" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">

<!-- Include jQuery -->
<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>

<!-- Bootstrap Date-Picker Plugin -->
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/js/bootstrap-datepicker.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/css/bootstrap-datepicker3.css"/>





</body>



</html>

编辑 添加了完整的当前 test.html

{% extends "base_alt_simple.html" %}
{% load static %}

{% block title %}Schedule{% endblock %}

{% block main_content %}

<div class="container">

  <h3>Building name</h3>

</div>

<div class="container">

  <div class="jumbotron">
  <h4>Find a time to visit </h4>

  <div class="container">
  <div class="row">


   <div class="col-md-6 col-sm-6 col-xs-12">
    <form method="post">
     <div class="form-group ">
      <label class="control-label " for="date">
       Date
      </label>
      <div class="input-group">
       <div class="input-group-addon">
        <i class="fa fa-calendar">
        </i>
       </div>
       <input class="form-control" id="date" name="date" placeholder="MM/DD/YYYY" type="text"/>
      </div>
     </div>
     <div class="form-group">
      <div>
       <button class="btn btn-primary " name="submit" type="submit">
        Submit
       </button>
      </div>
     </div>
    </form>
   </div>

  </div> <!-- row -->
  </div> <!-- /container -->

  </div> <!-- end jumbotron -->

</div> <!-- end container -->


{% endblock main_content %}


{% block scripts %}

<script src="{% static 'js/custom.js' %}"></script> 

{% endblock scripts %}

【问题讨论】:

    标签: javascript django


    【解决方案1】:

    您必须使用静态文件,请按照this django doc 中的步骤操作。

    假设你把你的yourscript.js放在你的django应用目录your_app/static/yourscript.js中,你所要做的就是:

    {% load static %}
    <script src="{% static 'yourscript.js' %}"></script>
    

    希望这会有所帮助!

    更新:

    确保将custom.js 放置在引导程序和日期选择器之后,以便您可以放置​​

    <script src="{% static 'custom.js' %}"></script> 
    

    就在base_alt_simple.html 中的&lt;/body&gt; 之前。或者如果你不想把它放在那里,你可以定义一个脚本块:

    {% block scripts %}
    
    {% endblock %}
    

    再次在&lt;/body&gt; 之前在base_alt_simple.htmltest.html 中:

    {% load static %}
    {% block scripts %}
    <script src="{% static 'custom.js' %}"></script>
    {% endblock %}
    

    另外,不要忘记将custom.js 放入your_app/static/custom.js 并重新启动您的服务器。

    【讨论】:

    • 我在基本模板中有加载标签。然后我将脚本更改为看起来像你的。但是,只有当我在模板中有 js 脚本时,日历弹出窗口才有效。我没有做什么来通过脚本命令将其拉入?
    • 能看到你的 base_alt_simple.html 吗?
    • 刚刚添加了完整的基本模板
    • 刚刚采纳了您的建议。现在我收到错误:Invalid block tag on line: 'static', expected 'endblock'. Did you forget to register or load this tag? 更新原始问题以显示编辑。
    • 我的 custom.js 中有一个以前版本的 js,这可能是个问题。把它清理干净,现在可以工作了。谢谢!
    【解决方案2】:

    Django 以完全不同的方式将静态文件加载到模板中。您应该首先设置您的 static 目录,然后他们使用 Django 的特殊模板标签从那里加载您的静态文件。如果您的 js 代码在 yourscript.js,在您的模板中,您将执行以下操作:

    {% load static %}
    
    <script src="{% static 'relative/path/from/static/dir/yourscript.js' %}"></script>
    

    Django 将静态文件收集到static 目录。为了获得更多关于如何在你的项目中设置静态目录的信息,请阅读the official Django doc on static files.

    【讨论】:

      猜你喜欢
      • 2012-04-27
      • 2011-01-11
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多