是否有用于在 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 的库?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中实现装饰器模式

装饰器不在 Django 中处理视图函数

django 信号是不是也包含在 transaction.atomic 装饰器中?

Django中视图的多个装饰器:执行顺序

如何在 PHP 中实现装饰器?

基于类的视图django中的JWT验证