在Django中实现通用的受保护预览

时间:2011-03-09 23:13:54

标签: django django-views

我正在尝试为Django管理员添加某种通用预览功能。与Django内置的预览现场功能相反,只有具有特定权限的登录用户才能看到此预览。

我的所有内容模型都具有相同的基类,可以添加已发布和未发布的状态。显然未发布的内容不会出现在网站上,但编辑仍然可以预览未发布的网站。

我在即将发布的Django 1.3版本中读到了基于类的视图,它可能非常适合以通用方式实现它。使用Django 1.2我似乎无法提出解决方案而不触及任何单一视图并添加特定权限检查。有没有人之前做过类似的事情?

1 个答案:

答案 0 :(得分:2)

我相信Django Admin已经为任何提供get_absolute_url()方法的模型的管理页面提供了“在网站上显示”选项。使用装饰器,应该可以跨模型以通用方式执行此操作

class MyArticleModel(Article): #extends your abstract Article model
    title = .....
    slug = ......
    body = ......

    @models.permalink
    def get_absolute_url(self): # this puts a 'view on site' link in the model admin page
        return ('views.article_view', [self.slug])

#------ custom article decorator -------------------
from django.http import Http404
from django.shortcuts import get_object_or_404

def article(view, model, key='slug'):
    """ Decorator that takes a model class and returns an instance 
        based on whether the model is viewable by the current user. """
    def worker_function(request, **kwargs):
        selector = {key:kwargs[key]}
        instance = get_object_or_404(model, **selector)
        del kwargs[key] #remove id/slug from view params
        if instance.published or request.user.is_staff() or instance.author is request.user:
            return view(request, article=instance, **kwargs)
        else:
            raise Http404
    return worker_function

#------- urls -----------------

url(r'^article/(?(slug)[\w\-]{10-30})$', article_view, name='article-view'),
url(r'^article/print/(?(id)\d+)$', 
     article(view=generic.direct_to_template,
             model=MyArticleModel, key='id'),
     name='article-print-view'
)

#------ views ----------------
from django.shortcuts import render_to_response

@article(MyArticleModel)
def article(request, article):
    #do processing!

    return render_to_response('article_template.html', {'article':instance}, 
                              xontext_instance=RequestContext(request) )

希望这是有用的信息(希望是正确的);