【问题标题】:Django: Implementing a nested, reusable component designDjango:实现嵌套的、可重用的组件设计
【发布时间】:2012-11-12 21:16:22
【问题描述】:

我正在 Django 中开发一个大型社交网络应用程序,我希望在该应用程序中多次使用某些前端组件,并且通常以这样的方式设计功能,即自定义组件包含其他自定义组件,而这些自定义组件可能包含更小的子组件(无限)。所有这些组件通常都是动态生成的。我试图找出在 Django 框架中构建它的最佳方法,这样我的组件就易于维护并具有清晰的编程接口。严重依赖全局上下文似乎与此相反,但是,我可以看到通过在视图中一次完成所有查询来避免冗余查询的优势。

自定义包含模板标签似乎很适合实现组件,但我想知道,高度嵌套的模板标签会产生性能问题,还是解析架构阻止了这种情况?在视图级别使其自文档化的最佳方式是什么?渲染主页模板、自定义标签和所有内容需要什么上下文?我认为尝试正确维护代码以设置模板上下文将是一场小噩梦。最后,维护这些组件的 CSS 的最佳方式是什么?

请随意提出其他推荐的用于创建嵌套组件设计的方法。

【问题讨论】:

    标签: python django django-views


    【解决方案1】:

    到目前为止,我决定的解决方案是继续使用包含标签库作为我的可重用组件集。我尽可能坚持在我的视图代码中设置所有查询,并在我的上下文中将它们传递给预先设置——没有在模板或标记库代码中生成新查询的函数。包含模板包含项目的所有标记,样式进入主站点样式表,使我的类尽可能通用和可重用,遵循SMACSS 的指导方针。我仅在 DRY 需要时将组件重构为包含标签。

    我最初让我的包含标记函数显式地采用标记模板使用的参数,例如:

    页面模板

    <div>{% my_tag param1 param2 %}</div>
    

    标签库

    @register.inclusion_tag('myapp/tagtemplates/my_tag.html')
    def my_tag(param1, param2):
        return {'param1': param1, 'param2': param2}
    

    my_tag.html

    <div>Blah: {{ param1 }}</div>
    <div>Blip: {{ param2 }}</div>
    

    ...显然视图设置了上下文。

    但我决定改用takes_context 参数来避免在标记库中显式定义参数。过多的重复导致文档中没有足够的回报。到目前为止,我的组件非常简单,从标签模板的检查中可以清楚地看到依赖关系。我担心这对于复杂的嵌套组件可能无法接受,但我总是可以让我的标签库函数在它们需要的地方变得冗长。

    从维护的角度来看,我对这种设置并不完全满意。我不喜欢这样,我将不得不手动跟踪不再需要的上下文数据。我不喜欢我的 CSS 类必须仔细命名以避免冲突的事实。

    我仍然对新的解决方案持开放态度,因为我不确定我所决定的是否真的是最佳做法。

    【讨论】:

      【解决方案2】:

      这是一个有趣的问题。理想情况下,您应该在渲染之前从数据库中提取所有组件。但是从层次结构来看,制作模板标签是有道理的。这些模板标签将提取适当的数据。出于此问题的目的,假设数据库查询由于搜索局部性而被缓存。

      【讨论】:

      • 这对我来说似乎是一个非常普遍的问题,这就是为什么我觉得手册、我找到的任何资源、也没有我收到的任何答案有点奇怪(直到你的),直接解决使架构在组件级别上模块化和可维护的问题。也许人们并没有真正使用 Django。但即使是这样,我希望任何 MVC 框架中都存在基本问题。
      猜你喜欢
      • 2023-04-04
      • 2017-11-14
      • 2013-06-04
      • 2011-04-12
      • 1970-01-01
      • 2019-03-14
      • 2016-10-09
      • 2020-05-20
      • 1970-01-01
      相关资源
      最近更新 更多