1

我正在创建一个 Backbone / Django 应用程序,我想知道如何为 Backbone 视图实现驻留在不同文件中的模板。从 Rails 开始,我习惯于使用 JST,它允许我拥有像这样的文件夹结构

 -js
   -backbone
     -templates
      template1.jst
      template2.jst

据我了解,应该可以使用Django-Pipeline进行相同的操作, 但我发现实现起来很困难。

我已将以下几行添加到我的settings.py

STATICFILES_STORAGE = "pipeline.storage.PipelineStorage"

PIPELINE_CSS_COMPRESSOR = None
PIPELINE_JS_COMPRESSOR = None

PIPELINE_JS = {
  'application': {
    'source_filenames': (
      'js/backbone/templates/**/*.jst',
    )
  }
}

我将此添加到 base.html

{% load compressed %}
{% compressed_js 'application' %}

我认为这将允许我通过JST客户端上的对象引用我的模板,但它没有定义。我是否误解了 Django-Pipeline 的目的,或者我只是在配置中遗漏了一些东西?

4

2 回答 2

2

不,你没有误解 django-pipeline。您将能够访问主干代码中的 javascript 模板。在我给你答案之前,让我们先看看 django-pipeline 文档是怎么说的。

Pipeline 允许您将 javascript 模板与您的 javascript 视图一起使用。要使用您的 javascript 模板,只需将它们添加到您的 PIPELINE_JS 组

因此,您可以将模板添加到设置文件中的管道中,例如:

PIPELINE_JS = {  
  'templates': {
     'source_filenames': (
        'js/templates/**/*.jst',
        ),
     'output_filename': 'js/templates.js'
  }
}

现在您必须在浏览器中加载这些 javascript 模板。

请注意:您必须确保在加载任何使用模板的 javascript 代码之前加载模板。否则你会得到一个未定义的错误。

{% load compressed %}
{% compressed_js 'templates' %}
{% compressed_js 'other_backbone_files' %}

现在文档说:

它将通过 window.JST 从您的 javascript 代码中获得

因此,您将拥有一个名为“window”的全局对象,并且您将能够使用其“JST”属性访问模板。JST 属性的值是另一个 javascript 对象。该对象的属性是模板的名称,其值是模板。模板的名称取决于您在设置文件中包含模板的方式。

例如,如果在您的设置文件中,您将模板包含为:

'source_filenames': (
        'js/templates/**/*.jst',
        )

并且您在“js/templates/app/footer.jst”中有一个模板,您可以通过以下方式在您的 javascript 代码中访问该模板:

template: window.JST['app_footer']

或者如果你做了类似的事情:

'source_filenames': (
        'js/templates/app/*.jst',
        )
OR
'source_filenames': (
        'js/templates/app/footer.jst',
        )

并且您在“js/templates/app/footer.jst”中有一个模板,您可以通过以下方式在您的 javascript 代码中访问该模板:

template: window.JST['footer']

请注意,您需要从第一个“*”中包含模板的名称

如果您仍然不确定,那么您可以在您的 javascript 控制台中检查 window.JST 对象以检查其属性。

如果您想使用“JST”以外的其他属性名称,则可以使用 settings.py 中的以下设置来更改它

PIPELINE_TEMPLATE_NAMESPACE = 'window.Templates'

现在您可以访问您的模板将在 window.Templates 对象中,而不是在 window.JST

于 2014-08-02T08:42:54.787 回答
0

似乎您还应该添加 'js/backbone/templates/ .jst' 因为 'js/backbone/templates/* /*.jst' 将仅匹配子文件夹中的模板。

于 2014-05-08T13:42:45.173 回答