2016-05-18 3 views
4

__init__フォームのリクエストにアクセスするにはどうすればよいですか?ModelFormの__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を使用している場合は?

答えて

4

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

あなたはで文書化され、user_passes_testデコレータを使用することができます:あなたはMyFormあなたがFormView.get_form_kwargsメソッドをオーバーライドすることができ、リクエストにアクセスする必要がある場合は 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): 
    ...