我想在Django中使用类似于Draper实现的“视图模型装饰器”。在
我已经使用了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 %}
当然,如果有更简洁干练的东西,比如:
^{pr2}$Draper允许您定义传递给模板的模型应该是“修饰”的,也就是说,封装在一个提供额外方法的类中,并选择性地代理与实际模型类不匹配的所有内容—将特定于模型的模板逻辑与面向数据的模型方法分离开来。在
我真的不想污染我的模特去做这件事。在
如果我要手动执行类似的操作,那么在我看来,这将涉及到这样的操作:
def get_context_data(self, **kwargs):
context = super(CapturesView, self).get_context_data(**kwargs)
context.update({
"article": ArticleDecorator(self.object)
})
return context
并且ArticleDecorator
将定义link方法,并使用magic方法将任何其他attr调用传递给真正的Article
对象。在
然而,手工完成所有这些都是相当麻烦的,Draper gem会自动处理一些事情,比如自动装饰装饰装饰模型的关系,例如ArticleDecorator.comments
将返回CommentDecorator
的列表,而不是{
有没有库可以自动化视图的这种模型抽象?在
在django中,在不接触原始模型的情况下向模型添加特定行为通常是通过"proxy model"完成的
相关问题 更多 >
编程相关推荐