简体   繁体   中英

Class Based View and decorators

I have a FormView for displaying form, and code goes on like this:

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

the decorator check_user_type is like this:

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

In my decorator I want To make sure that only certain type of user get to see the form, ie if request.user.Iam == 'Architect' or request.user.Iam == 'Interior Designer' only see the form and others see a message "Only architects/Interior Designer get to upload photos".For this i want to insert a variable 'invalid_user' to be passed along, depending on which i display the form or the message. Problem is I am unable to pass the variable :( alongwith it .. and a doubt.. if i have correctly devised the idea to do so.. ?

If I understand you correctly, you want to pass this argument to check_user_type decorator, right? Then you need to nest another function in your decorator, using closure to set variables inside it. Something like

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

then parameter is available inside scopes of both inner functions.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM