How do I access the request object or any other variable in a form’s clean() method?

The answer by Ber – storing it in threadlocals – is a very bad idea. There’s absolutely no reason to do it this way.

A much better way is to override the form’s __init__ method to take an extra keyword argument, request. This stores the request in the form, where it’s required, and from where you can access it in your clean method.

class MyForm(forms.Form):

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(MyForm, self).__init__(*args, **kwargs)


    def clean(self):
        ... access the request object via self.request ...

and in your view:

myform = MyForm(request.POST, request=request)

Leave a Comment