8

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

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

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

4

2 回答 2

2

到目前为止,我决定的解决方案是继续使用包含标记库作为我的可重用组件集。我尽可能坚持在我的视图代码中设置所有查询,并在我的上下文中将它们传递给预先设置——没有在模板或标记库代码中生成新查询的函数。包含模板包含项目的所有标记,样式进入主站点样式表,使我的类尽可能通用和可重用,遵循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 类必须仔细命名以避免冲突的事实。

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

于 2012-11-16T08:54:03.170 回答
0

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

于 2012-11-15T12:26:04.703 回答