是否有用于在 Django 中实现视图模型装饰器 ala Draper 的库?
Posted
技术标签:
【中文标题】是否有用于在 Django 中实现视图模型装饰器 ala Draper 的库?【英文标题】:Is there a library for implementing view model decorators ala Draper in Django? 【发布时间】:2015-07-02 19:24:14 【问题描述】:我想要“视图模型装饰器”,例如 Draper 在 Django 中为 Rails 实现。
我已经使用了get_absolute_url
及其变体(编辑、删除等)——这使得反转通用模型 URL 变得更容易,但现在我发现自己在模板中写了很多这样的东西:
% if user has 'accounts.view_user' of article.author %
<a href=" article.author.get_absolute_url " class="fn">
article.author.name
</a>
% else %
article.author.name
% endif %
如果有更简洁和干燥的东西当然会很好,比如:
user.link
user.edit_link
Draper 所做的是允许您定义传递给模板的模型应该是“装饰的”,即包装在一个提供额外方法的类中,并且可以选择代理与真实模型类不匹配的所有内容 - 分离模型特定的模板逻辑远离面向数据的模型方法。
我真的不想污染我的模型来做到这一点。
如果我要手动执行类似的操作,我认为会涉及到这样做:
def get_context_data(self, **kwargs):
context = super(CapturesView, self).get_context_data(**kwargs)
context.update(
"article": ArticleDecorator(self.object)
)
return context
ArticleDecorator
将定义链接方法,并使用魔术方法将任何其他 attr 调用传递给真正的 Article
对象。
但是,手动执行所有这些操作非常麻烦,并且 Draper gem 会自动执行诸如自动装饰装饰模型的关系之类的事情,例如ArticleDecorator.comments
将返回 CommentDecorator
的列表,而不是 Comments
。
是否有任何库可以自动执行这种视图模型抽象?
【问题讨论】:
类似template tag? @J0HN 不,我会用一个例子来改进我的问题 【参考方案1】:在 django 中,在不触及原始模型的情况下向模型添加特定行为通常使用 "proxy model" 完成
【讨论】:
以上是关于是否有用于在 Django 中实现视图模型装饰器 ala Draper 的库?的主要内容,如果未能解决你的问题,请参考以下文章