Django:实现嵌套的,可重用的组件设计

时间:2012-11-12 21:16:23

标签: python django django-views

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

自定义包含模板标签看起来非常适合实现组件,但我想知道,高度嵌套的模板标签是否会产生性能问题,或者解析架构是否会阻止这种情况?在视图级别使其自我记录以呈现主页面模板,自定义标签和所有内容所需的上下文的最佳方法是什么?我想象一下,尝试正确维护代码来设置模板上下文是一个小小的噩梦。最后,维护这些组件的CSS的最佳方法是什么?

随意建议其他建议的方法来创建嵌套组件设计。

2 个答案:

答案 0 :(得分: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类必须仔细命名以避免冲突的事实。

我仍然愿意接受新的解决方案,因为我不确定我所确定的是最佳做法。

答案 1 :(得分:0)

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