是否有用于在Django中实现视图模型装饰器ala Draper的库?

时间:2015-04-24 09:09:39

标签: python django python-decorators

我希望"查看模型装饰者"像Django中的Draper实现Rails一样。

我已经使用get_absolute_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所做的是允许您定义传递给模板的模型应该是&#34;装饰&#34;即包含在提供额外方法的类中,并且可选地代理与实际模型类不匹配的所有内容 - 将模型特定的模板逻辑与数据导向的模型方法分开。

我真的不想污染我的模特去做。

如果我要手动执行类似的操作,那么在我的视图中会这样做:

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的列表。

是否有任何库可以为视图自动化这种模型抽象?

1 个答案:

答案 0 :(得分:2)

在django中,通常使用"proxy model"

在不触及原始模型的情况下向模型添加特定行为