【问题标题】:What is the best way of including common content (for example header script) in django / python web app在 django / python web 应用程序中包含常见内容(例如标题脚本)的最佳方式是什么
【发布时间】:2012-08-15 14:24:03
【问题描述】:

在 php 文件中,这个任务可能是另一个文件的简单包含,但我想知道在 Django 中是否有类似的做法?就像这里描述的:https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#include

【问题讨论】:

  • 您想要包含 css/js 文件还是想要包含 python 代码/模块?
  • 嗯,我认为无论我包括什么都是一样的原则?

标签: python django


【解决方案1】:

简短回答:不,Python 不会那样执行。

这是一个很长的:

一点关于 PHP 和 Python web 开发的区别

首先,includerequire 是 PHP 语言本身的一部分。这意味着在处理源代码之前,PHP 解释器包含来自文件的源代码作为这些函数的参数,然后进行解释。这就是 PHP 设计的主要目的(HTML,或者,一般来说,文本预处理)的继承。

Python 中的 Web 开发有点不同。语言本身被设计为通用编程语言,因此默认情况下它不假定文本处理。代码刚刚执行。这就是为什么 Web 开发通常使用框架(或 wsgi 模块,如果您更喜欢从头开始做所有事情的话)来完成的原因。

以上所有意味着所有文本操作(您生成的所有输出,您通常通过创建结果文本字符串(或与缓冲一起使用时的字符串列表)手动完成并自己提供输出结果。

模板语言

模板语言的诞生有点混乱,它成为每个(或几乎每个)用 Python 编写的 Web 应用程序的重要组成部分(您可以假设与 PHP 世界中的 Smarty 类似)。它们有很多:jinja、jinja2、mako、chameleon ......等等。它们都不同,但目的相同(通过为基本表示逻辑的数据提供带有占位符的模板来轻松生成文本)。

Python Web 框架的主要特点是:应用程序逻辑和表示是严格分开的。

我们来到了你的问题的实质:

由于所有提供文本模板工具的模板库都不同,因此没有通用的方法来制作 类 PHP 的包含,我们可以说它们是 Python 通用的。这些工具中的每一个都提供了不同的处理方式和理念,具体包括,主要分为两种主流方式:

  • 基于宏和插槽(变色龙)
  • 基于模板继承(Jinja2、Django 模板语言)

您所需要的只是选择最适合您需求的一种(无论您喜欢/不喜欢它们的语法,其中一些更快,一些更具可读性,等等..)并将其与其他工具结合使用为您的应用程序提供逻辑。

走近:关于 D​​jango

当您想要包含应用程序的某些重用部分(例如分页小部件)时,通常使用包含模板标签,您已针对这些部分调整了视图上下文。

但是当你有所有页面的共同标题,或者另一个共同部分时,最好使用继承,这分两步实现:

  • 基本模板已创建(包含通用页眉和页脚)
  • 特定模板是通过模板继承特性创建的,特别是Django中的extends模板标签

【讨论】:

  • 所以你说而不是这样做: {% include "header.html" %} 我应该创建一个返回 header.html 作为模板的视图并使用它。感谢史诗般的回答。
  • 您只需为您的所有页面制作一个包含通用代码的“基本”模板,并在其中制作“块”,您可以在其中填写“子”模板,这是您情况的最佳出路。首先阅读本文以获取有关如何执行此操作的更多信息:docs.djangoproject.com/en/dev/topics/templates
  • 不错,我觉得 {% include "header.html" %} 是一种非常古老的做事方式。子模板更有意义。
【解决方案2】:

Python 不是 PHP!

Django 不允许您在模板中编写任意脚本(代码)。您应该在views.py(控制器)中完成所有计算/业务任务并将结果传递给模板。在模板中,您通常会遍历结果集并显示数据。在 django 1.4 中添加了一个新的 assignment 标签,所以你可以这样做

{% get_movie_tickets_for_theater movie theater as tickets %}

但是您的get_movie_tickets_for_theater 将在 templatetags python 文件中定义。

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多