__Init__ access request in ModelForm

How can I get a request on the form __init__?

forms.py

class MyForm(forms.ModelForm):

    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 ...

views.py

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

but what if I use class based views FormView?

+4
source share
2 answers

If you need to access the request in MyForm, you can override the method FormView.get_form_kwargs.

def get_form_kwargs(self):
    kwargs = super().get_form_kwargs()
    kwargs.update({'request': self.request})
    return kwargs

FormView Source

class FormMixin(ContextMixin):
    ...
    def get_form(self, form_class=None):
        """
        Returns an instance of the form to be used in this view.
        """
        if form_class is None:
            form_class = self.get_form_class()
        return form_class(**self.get_form_kwargs())

    def get_form_kwargs(self):
        """
        Returns the keyword arguments for instantiating the form.
        """
        kwargs = {
            'initial': self.get_initial(),
            'prefix': self.get_prefix(),
        }

        if self.request.method in ('POST', 'PUT'):
            kwargs.update({
                'data': self.request.POST,
                'files': self.request.FILES,
            })
        return kwargs
        if form_class is None:
            form_class = self.get_form_class()
        return form_class(**self.get_form_kwargs())
+4
source

You can use the user_passes_test decorator, documented at: https://docs.djangoproject.com/en/1.9/topics/auth/default/#django.contrib.auth.decorators.user_passes_test

def my_test(user):
    return user.username == 'me'

@user_passes_test(my_test)
class MyView(FormView):
    ...
-1
source

All Articles