Django 在许多模板中使用小模板:自定义标记还是基于类的视图?

Django 在许多模板中使用小模板:自定义标记还是基于类的视图?,django,django-class-based-views,django-custom-tags,Django,Django Class Based Views,Django Custom Tags,我最近发现,最好的方法是什么,以包括可以重复的,我们可以在许多页面上找到的模板的小片段。我称它们为“widget”,不是以Django的方式(如果我引用文档的话,widget是一个输入元素的表示),而是以一种可以停靠到网站任何页面的方式。我想到的是:与文章相关的评论列表、右菜单中的聊天框、评论表单或其他 问题是,对于我的问题,我只看到两种解决方案,一种比另一种更好,但并不完全满足我 基于类的视图:我认为最好的方法是使用mixin。 优点:以一种高效的方式处理表单,逻辑保持不变(表单处理、数据

我最近发现,最好的方法是什么,以包括可以重复的,我们可以在许多页面上找到的模板的小片段。我称它们为“widget”,不是以Django的方式(如果我引用文档的话,widget是一个输入元素的表示),而是以一种可以停靠到网站任何页面的方式。我想到的是:与文章相关的评论列表、右菜单中的聊天框、评论表单或其他

问题是,对于我的问题,我只看到两种解决方案,一种比另一种更好,但并不完全满足我

  • 基于类的视图:我认为最好的方法是使用mixin。
    • 优点:以一种高效的方式处理表单,逻辑保持不变(表单处理、数据库查询在必须执行的地方执行)。例如,当我们从CommentListMixin继承时,我们真正创建了一篇文章与其注释之间的现有关系
    • 缺点:我们必须显式地从相应的mixin继承。我们不能做我们想做的一切,因为从mixin和view继承可以覆盖其中一个的属性
  • 自定义标签:我认为这是最糟糕的方式。标记的存在不是为了呈现模板的一部分(使用数据库查询、创建表单),而是为了“操纵”数据,以特定的方式呈现它。
    • 优点:不需要在视图中显式调用,“all”在模板中(不应该)
    • 缺点:处理表单很棘手,当我使用它们来完成一个视图应该完成的工作时,逻辑被破坏了
现在,我听到您说:“所以,您应该使用基于类的视图和混合”。事实上,不,当我将它们用于“小部件”(实现为mixin)以显示与当前文章相关的注释列表时,这不是问题,我只需要将相关的mixin添加到当前视图中。但当我想在我的网站的所有页面上放置一个“小部件”时,这就成了一个问题。例如,聊天框与特定文章无关,我不想在所有视图中添加聊天框mixin(如果我决定将其从我的网站中删除怎么办?)。所以在这个例子中,我应该使用一个自定义标记,因为我相信这是最简单的方法


有人能让我轻松一下吗

您可以尝试创建一个名为
aside\u chat.html
{%include'aside\u chat.html%}
的模板,将其放入基本模板或仅放入所需的模板中。如果您需要向所有视图添加任何变量,您可以使用上下文预处理器甚至中间件。您的问题似乎暗示您相信基于类的视图和自定义标记以某种方式相互排斥,即您可以使用其中一种。没有理由不能将两者混用。事实上,“小部件”(你称之为“widget”)与视图无关,不管它们是如何实现的。这是在模板本身中正确处理的,根据需要使用自定义标记、导入(或扩展)子模板和模板预处理器。