2010-04-21 8 views
10

मेरा प्रश्न बहुत ही इस एक के समान है: How do I access the request object or any other variable in a form's clean() method?Django: व्यवस्थापक के form.clean से पहुंच अनुरोध वस्तु()

छोड़कर, मैं व्यवस्थापक फार्म के साथ एक ही समस्या है। तो मैं खुद को फॉर्म में शामिल करने का कोई तरीका नहीं देख सकता, इसलिए - इसके लिए अनुरोध पास करने के लिए।

पहले से धन्यवाद।

+0

Django। –

+0

@Adam - क्षमा करें ?? – Wiseman

उत्तर

31

दरअसल, आपकी समस्या का समाधान करने का एक तरीका है!

आप subclass formModelAdmin.get_form() द्वारा प्रदान की जरूरत है और यह स्थान पर आ जाएगी: भी, आप के लिए

class BusinessDocumentCommentForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request', None) 
     # Voila, now you can access request anywhere in your form methods by using self.request! 
     super(BusinessDocumentCommentForm, self).__init__(*args, **kwargs) 
     if self.request.GET.get('document_pk', False): 
      #Do something 
    def clean(self): 
     # Do something with self.request 
     # etc.  
    class Meta: 
     model = BusinessDocumentComment 

class BusinessDocumentCommentAdmin(admin.ModelAdmin): 

    form = BusinessDocumentCommentForm  

    def get_form(self, request, obj=None, **kwargs): 

     AdminForm = super(BusinessDocumentCommentAdmin, self).get_form(request, obj, **kwargs) 

     class AdminFormWithRequest(AdminForm): 
      def __new__(cls, *args, **kwargs): 
       kwargs['request'] = request 
       return AdminForm(*args, **kwargs) 

     return AdminFormWithRequest 
+0

यह हल करने का यह एक शानदार तरीका है! हालांकि, मैं यहां 'मेटा क्लास' शब्द के उपयोग के बारे में थोड़ा उलझन में हूं। जैसा कि मैंने इसे देखा, ModelFormMetaClass सिर्फ आपके फॉर्म का एक सुपरक्लास है। मुझे यहां क्या समझ नहीं आ रहा है? – mkoistinen

+1

@mkoistinen, आप बिल्कुल सही हैं। यह विचार अतीत में कुछ समय हुआ, लेकिन मैं जवाब को सही करने के लिए बहुत आलसी था। चूंकि लोग अभी भी स्निपेट का उपयोग कर रहे हैं, इसलिए मुझे इसे सही करने की ज़िम्मेदारी है। प्रतिक्रिया के लिए धन्यवाद। :-) –

+0

अद्यतन करने के लिए धन्यवाद, और, मुझे उपरोक्त मेरी टिप्पणी में यह गलत मिला। इसका एक * सबक्लास * है। ऊप्स! – mkoistinen

0

ModelAdmin कक्षा में कई हुक हैं जो आपको यह करने की अनुमति देते हैं - django.contrib.admin.options में कोड को देखें।

आपकी मदद करने में दो विधियां ModelAdmin.save_form और ModelAdmin.save_model हैं, जिनमें से दोनों अनुरोध ऑब्जेक्ट पास कर चुके हैं। तो आप इन तरीकों को अपने व्यवस्थापक उपclass में ओवरराइड कर सकते हैं और आपको आवश्यक अतिरिक्त प्रक्रिया कर सकते हैं।

टिप्पणी

के बाद संपादित आप बहुत सही यह आप प्रपत्र उपयोगकर्ता के विशेषाधिकार पर निर्भर मान्य नहीं दूँगी कि कर रहे हैं। दुर्भाग्य से फॉर्म तत्काल को add_view और change_viewModelAdmin के तरीकों के भीतर गहरा दफनाया गया है।

बहुत सारे मौजूदा कोड को डुप्लिकेट किए बिना कई संभावनाएं नहीं हैं। आप *_view विधियों को ओवरराइड कर सकते हैं; या आप पहले से बेक्ड अनुरोध ऑब्जेक्ट के साथ एक नई कक्षा वापस करने के लिए modelform_factory फ़ंक्शन को आजमा सकते हैं और ओवरराइड कर सकते हैं; या आप एक ही काम करने के लिए फॉर्म क्लास __new__ विधि के साथ झुकाव करने का प्रयास कर सकते हैं, लेकिन फॉर्म मेटाक्लास के कारण यह मुश्किल है।

+0

डैनियल, आपके उत्तर के लिए धन्यवाद! असल में, मैंने इन विधियों को ओवरराइड करने का प्रयास किया है, फॉर्म को कार्यान्वित करने से पहले ... लेकिन - हम समझ गए हैं (यदि आपके द्वारा गलत नहीं किया जा रहा है, तो आपके उत्तरों में से एक से) इन विधियों से सत्यापन करने का कोई तरीका नहीं है। "सत्यापन" से, मेरा मतलब है कि कुछ सामग्री को सहेजने की क्षमता नहीं है अगर मुझे कुछ पसंद नहीं है और साथ ही कुछ मूल्यवान प्रतिक्रिया देने की क्षमता भी है। मेरा कार्य है - उपयोगकर्ता अधिकारों के आधार पर व्यवस्थापक इनपुट का सत्यापन। क्या मैं गलत जगह पर खुदाई कर रहा हूं? – Wiseman

+0

ऊपर मेरा विस्तारित उत्तर देखें। –

+0

मछली पकड़ने की छड़ के अच्छे गुच्छा के लिए फिर से बहुत धन्यवाद! – Wiseman

संबंधित मुद्दे