2011-09-04 10 views
6

मॉडलफॉर्म के मेरे कार्यान्वयन में, मैं वर्तमान उपयोगकर्ता सुपरसियर के आधार पर विभिन्न प्रकार के सत्यापन जांच करना चाहता हूं। मैं वर्तमान अनुरोध उपयोगकर्ता तक कैसे पहुंच सकता हूं?django: ModelForm में वर्तमान अनुरोध उपयोगकर्ता तक कैसे पहुंचे?

उत्तर

10

आप उपयोगकर्ता ऑब्जेक्ट को फॉर्म कन्स्ट्रक्टर में अतिरिक्त तर्क के रूप में पास कर सकते हैं।

उदा।

f = MyForm(user=request.user) 

और निर्माता तरह दिखेगा:

class MyForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     self.user = kwargs.pop('user',None) 
     super(MyForm, self).__init__(*args, **kwargs) 

और फिर clean_XX रूपों में उपयोगकर्ता का उपयोग के रूप में आप चाहते हैं

+0

मूल प्रश्न में यह स्पष्ट नहीं के बारे में क्षमा करें, लेकिन मेरे मॉडलफॉर्म को मॉडलएडमिन सबक्लास तक लगाया गया था। मैं ModelAdmin से ModelForm के कस्टम कन्स्ट्रक्टर को कैसे शुरू कर सकता हूं? – zer0stimulus

+0

तो आप django व्यवस्थापक इंटरफ़ेस के भीतर ऐसा करना चाहते हैं? कोशिश नहीं की है, लेकिन मुझे लगता है कि आप फॉर्म की __call__ विधि को ओवरराइट करने का प्रयास कर सकते हैं। उदाहरण के लिए कुछ: http://stackoverflow.com/questions/727928/django-admin-how-to-access-the-request-object-in-admin-py-for-list-display-meth –

7

नोट: यदि आप उपयोग कर रहे हैं कक्षा के आधार दृश्य (CBVs) तो फॉर्म कन्स्ट्रक्टर में एक अतिरिक्त तर्क पारित करना (उदाहरण के लिए get_forms_class में) या form_class में काम नहीं करेगा, क्योंकि <form> object is not callable दिखाया जाएगा।

CBVs के लिए समाधान get_form_kwargs उपयोग करने के लिए है, जैसे:

views.py:

# Sending user object to the form, to verify which fields to display/remove (depending on group) 
def get_form_kwargs(self): 
    kwargs = super(MyView, self).get_form_kwargs() 
    kwargs.update({'user': self.request.user}) 
    return kwargs 

forms.py:

class MyForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     self.user = kwargs.pop('user') # To get request.user. Do not use kwargs.pop('user', None) due to potential security hole 

     super(MyForm, self).__init__(*args, **kwargs) 

     # If the user does not belong to a certain group, remove the field 
     if not self.user.groups.filter(name__iexact='mygroup').exists(): 
      del self.fields['confidential'] 
संबंधित मुद्दे