Python 基于类的视图和装饰器

Python 基于类的视图和装饰器,python,django-views,python-decorators,Python,Django Views,Python Decorators,我有一个用于显示表单的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, *arg

我有一个用于显示表单的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
def check_user_type(func):
    def wrapped_func(request, *args, **kwargs):
        kwargs['invalid_user'] = True
        return func(request,*args, **kwargs)
    return wrapped_func
装饰器检查用户类型如下:

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
def check_user_type(func):
    def wrapped_func(request, *args, **kwargs):
        kwargs['invalid_user'] = True
        return func(request,*args, **kwargs)
    return wrapped_func
在我的decorator中,我想确保只有特定类型的用户才能看到表单,即如果request.user.Iam=='Architect'或request.user.Iam=='Interior Designer'只看到表单,而其他人则看到一条消息“只有架构师/室内设计师才能上传照片”。为此,我想插入一个要传递的变量'invalid_user',取决于我显示的表单或消息。
问题是我无法传递变量:(还有一个疑问..如果我的想法正确的话..?

如果我理解正确,你想把这个参数传递给
check\u user\u type
decorator,对吗?然后你需要在decorator中嵌套另一个函数,使用闭包在里面设置变量。比如

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
然后,参数在两个内部函数的作用域内都可用