答案底部的介绍谈话(更直接的答案)。我假设您有一个用于文本处理的应用程序,称为文本,一个用于处理图片的应用程序,称为图片,以及第三个用于博客的应用程序,称为博客。
大图
您将需要学习有关 python 程序员模板语言的手册。这个想法是每件事都在它自己的应用程序中,并且你有一个连接一切的第三个应用程序。然后,应用程序应该提供您喜欢的模型和视图(只要记住让您专注于应用程序应该做什么)并提供一组模板标签。
如何制作包含标签
制作包含标签,这真的很容易!它会提醒您编写普通视图。
在您的应用程序文件夹中创建目录模板标签。__init__.py
还要在这个 templatetags 中创建一个文件(这样目录就变成了一个 python 包)。
然后创建一个python文件。名称很重要,您将在{% load xyz %}
将使用您的应用程序的模板中使用它。例如,如果调用文件picturestags.py
,您将调用
{% load picturestags %}
将使用它的所有模板。
首先在文件中添加一些您不需要考虑太多的政治,只需将其包含在其他任何内容之前:
from django.template import Library
register = Library()
然后通过定义与您的标签同名的函数来添加标签。我将在示例中将其称为 display_picture,它将采用一个参数 url。该函数应该创建一个您将在模板中使用的字典。我的示例将仅显示 url 指向的图片。
@register.inclusion_tag('pictures/display_picture.html')
def display_picture(url):
return {'picture': url}
在您的应用程序中创建路径模板/图片并在其中创建文件 display_picture.html 包含:
<img src="{{ picture }}" />
正如您可能理解的那样,@register 将其作为标签,字典 display_picture 返回的内容就是您可以在 display_picture.html 中使用的内容。非常像您的正常视图功能。
最后你会得到这些文件:
pictures/
__init__.py
models.py
views.py
tests.py
templates/
pictures/
display_picture.html
templatetags/
picturetags.py
这就是您需要添加到您的图片应用程序的全部内容。要在您的博客应用程序中使用它,您需要将图片添加到您的 INSTALLED_APPS。然后在模板中,您需要使用自己的新自制标签首先加载它:{% load picturestags %}
然后只需{% display_picture https://www.google.com/intl/sv_ALL/images/logos/images_logo_lg.gif %}
像这样添加标签:
{% load picturestags %}
<html>
<body>
{% display_picture https://www.google.com/intl/sv_ALL/images/logos/images_logo_lg.gif %}
</body>
</html>
结果
这只是一个小例子,但您可以看到它很容易扩展。您的博客可以通过导入模型和外键来连接文本和图片应用程序。您可以为某个博客文章连接文本和图片。您的 blog_post.html-template 可能看起来像(简化):
{% load picturestags %}
{% load texttags %}
<html>
<body>
<h1>{{ subject }}</h1>
<div class="article">{% article_to_html articleid %}</div>
<div class="article_picture">{% display_picture %}</div>
</body>
</html>
请注意,只有博客有依赖关系,它应该有依赖关系(没有文字和图片的博客......但图片可以没有文字)。外观和位置应该并且可以由 CSS 和 DIV/SPAN 标记控制。通过这种方式,您可以将您的图片应用程序提供给不了解文本应用程序的人并使用它,以不同的方式显示图片,可能无需接触您的代码!
包含标签是我唯一知道的,因为我昨天才知道这一点。我认为这是 Django 提供的一种便利,让生活变得简单。在文档页面上还有更多内容(包括如何在没有“快捷方式”的情况下艰难地制作“真实”标签)。因此,如果您发现此方法有限,请阅读文档...它有很多示例。它还讨论了如何制作过滤器、simple_tags、线程注意事项和其他高级内容。
介绍
我和你一样遇到了这个问题,我也想要一些与我读到的答案不同的东西(我并不是说答案很糟糕,它们帮助我学到了很多东西并给了我见解,但我想要这个我现在正在写) . 我设法弄清楚了一些不是很明显的事情,这要归功于您的问题,并且绝对要感谢 Stack Overflow,所以这是我对可能被放弃的半年前问题的贡献(可能会帮助一两个谷歌人)!
我还从Google Tech Talk Reusable Apps中获得了很多灵感。最后(43 分钟)他提到了一些很好的例子,比如django-tagging,这是他所说的如何编写可重用应用程序的模型。这给了我所有这一切的想法,因为这就是 django-tagging 解决我们曾经/拥有的这个问题的方式。
现在,在我写完所有这些(花了一个小时)之后,我第一次觉得我可能会做出贡献,而不仅仅是谷歌,关注别人在做什么,或者抱怨别人没有写出我需要做的事情。这是我第一次承担起写下我的观点的责任,这样其他人就可以在谷歌上搜索这个(只需要写下这段:-),因为它感觉真的很棒,即使它可能被撕成碎片或被忽视和遗忘)。