基于类的视图和装饰器

Posted

技术标签:

【中文标题】基于类的视图和装饰器【英文标题】:Class Based View and decorators 【发布时间】:2014-10-20 15:56:09 【问题描述】:

我有一个用于显示表单的 FormView,代码如下:

class AddProject(FormView):
    template_name = "project/add_project.html"

    @method_decorator(check_user_type)
    def dispatch(self,request, *args, **kwargs):
        return super(AddProject,self).dispatch(request, *args, **kwargs)

    def get_form_class(self):
        return AddProjectForm 

    def form_valid(self,form):
        #do validation, return response

装饰器 check_user_type 是这样的:

def check_user_type(func):
    def wrapped_func(request, *args, **kwargs):
        kwargs['invalid_user'] = True
        return func(request,*args, **kwargs)
    return wrapped_func

在我的装饰器中,我想确保只有特定类型的用户才能看到表单,即如果 request.user.Iam == 'Architect' 或 request.user.Iam == 'Interior Designer' 只能看到表单和其他人会看到一条消息“只有建筑师/室内设计师才能上传照片”。为此,我想插入一个变量“invalid_user”以传递,具体取决于我显示表单或消息的方式。 问题是我无法传递变量:(连同它..还有一个疑问..如果我正确地设计了这样做的想法..?

【问题讨论】:

【参考方案1】:

如果我理解正确,您想将此参数传递给check_user_type 装饰器,对吗?然后你需要在你的装饰器中嵌套另一个函数,使用闭包在其中设置变量。像

def check_user_type(parameter):
    def check_user_type_inner(func):
        def wrapped_func(request, *args, **kwargs):
            ... # parameter here depends on argument passed to most outer function
            return func(request,*args, **kwargs)
        return wrapped_func
    return check_user_type_inner

然后参数在两个内部函数的范围内都可用。

【讨论】:

以上是关于基于类的视图和装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Django中基于类的视图上带有参数的函数装饰器

Django 装饰器。需要帮助以找到基于类的视图的解决方案

基于 Python 类的装饰器,带有可以装饰方法或函数的参数

Vue + Typescript - 使用基于类的装饰器导入错误

视图函数:CBV与FBV (ps:补充装饰器)

了解使基于类的装饰器支持实例方法的技术[重复]