ModelForm中__init__中的访问请求

时间:2016-05-18 09:53:38

标签: django django-forms

如何以__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)

但是如果我使用基于类的视图FormView怎么办?

2 个答案:

答案 0 :(得分:4)

如果您需要在MyForm中访问请求,则可以覆盖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())

答案 1 :(得分:-1)

您可以使用user_passes_test装饰器,记录在: https://docs.djangoproject.com/en/1.9/topics/auth/default/#django.contrib.auth.decorators.user_passes_test

    var values = []; // declare it outside document.ready
    $( document ).ready(function() {   
        $('.sal').click(function(i) {
             values.push($(this).val()); // add value to array
        }); 
    });