2011-10-12 19 views
7

कृपया मुझे यह समझने में सहायता करें कि मेरे द्वारा किए गए निम्नलिखित विकल्प बेवकूफ/अच्छे हैं और यदि नहीं, तो सुधार कैसे करें।डीजेगो मॉडल प्रमाणीकरण को स्थानांतरित करने के लिए निष्क्रिय तरीका

1) फार्म मान्यकरण
से अधिक मॉडल मान्यकरण मैं के रूप में यह डेटा के लिए नियम बनाने के लिए एक और अधिक सूखी और मौलिक तरीके लगता है जब भी संभव हो फ़ॉर्म सत्यापन से अधिक नए model validation उपयोग करने के लिए पसंद करते हैं। एक साधारण कैलेंडर प्रविष्टि मॉडल के लिए दो उदाहरण:

"अवधि की तुलना में (अंत से शुरू) कम होना चाहिए" यह मुहावरेदार करने के लिए अच्छा है/"अंत से पहले किया जाना चाहिए शुरू" उन्हें मॉडल स्तर पर रखें ताकि उन्हें फॉर्म में डालना पड़े? यदि मॉडलफॉर्म सबसे अच्छा जवाब है, तो एक ही रूप में एकाधिक मॉडलों का उपयोग करने के मामले के बारे में क्या?
(संपादित करें: मुझे नहीं पता था कि कई ModelForms वास्तव में एक साथ इस्तेमाल किया जा सकता)

2) एक फॉर्म (नहीं ModelForm)
(संपादित करने के लिए मॉडल मान्यता स्थानांतरित कर रहा है: यह पता चला है पुनर्रचना मॉडल सत्यापन और फॉर्म सत्यापन के बीच नलसाजी मेरी स्थिति में आवश्यक नहीं है और नीचे दिए गए समाधान दिखाते हैं कि क्यों)
चलो एक पल के लिए मान लें कि मेरे पास किसी भी मॉडल सत्यापन त्रुटियों को सीधे स्थानांतरित किया जा सकता है और सीधे उपयोगकर्ता को प्रदर्शित किया जा सकता है (यानी अनुवाद मॉडल को अनदेखा करें उपयोगकर्ता के अनुकूल फॉर्म सत्यापन त्रुटियों में सत्यापन त्रुटियां)।

view_with_a_form: 
... 
if form.is_valid(): 
    instance = ... 
    ... 
    #save() is overridden to do full_clean with optional exclusions 
    try: instance.save() 
    except ValidationError e: 
     nfe= e.message_dict[NON_FIELD_ERRORS] 
     #this is one big question mark: 
     instance._errors['__all__'] = ErrorList(nfe) 
#this is the other big question mark. seems unnatural 
if form.is_valid() 
    return response... 
... #other code in standard format 
#send the user the form as 1)new 2)form errors 3)model errors 
return form 

कोड में टिप्पणी की है::
क) यह एक मुहावरेदार/अच्छा है

यह एक काम कर रहा तरह से मैं यह करने के लिए के साथ आया था (एक ही स्थान पर, कोई सहायक कार्यों) है मॉडल त्रुटियों को किसी रूप में स्थानांतरित करने का तरीका?

बी) क्या यह नई "फ़ॉर्म" त्रुटियों के परीक्षण के लिए एक मूर्ख/अच्छा तरीका है?

नोट: यह उदाहरण गैर-फील्ड त्रुटियों का उपयोग करता है, लेकिन मुझे लगता है कि यह फ़ील्ड त्रुटियों पर समान रूप से लागू हो सकता है।

+0

मैं चयनित उत्तर बदल रहा हूं क्योंकि स्टीफानो के अपडेट ने मुझे वास्तव में एक और विधि ([यहां संयुक्त मॉडलफॉर्म विधियों में से एक] को अनुकूलित करने के लिए आश्वस्त किया है (http://stackoverflow.com/questions/569468/django-multiple-models -एक-टेम्पलेट-उपयोग-रूपों)) मॉडल सत्यापन और फॉर्म सत्यापन के बीच नलसाजी को फिर से शुरू करने की आवश्यकता के बिना।(मुझे पता नहीं था कि उन्हें जोड़ा जा सकता है)। क्रिस का जवाब मेरी समझ में सबसे अच्छा है। – KobeJohn

उत्तर

4

-

मैं संक्षिप्त और सीधा हो जाएगा लेकिन असभ्य :)

1) मॉडल मान्यकरण फार्म मान्यकरण अधिक

हो नहीं करना चाहती [संपादित इस अपनी टिप्पणी का जवाब देता उम्मीद] मुझे लगता है कि अंगूठे का नियम यह हो सकता है कि जब तक कि नियम वास्तव में मॉडल से जुड़ा हुआ हो, हां, मॉडल स्तर पर सत्यापन करना बेहतर होता है।

बहु-मॉडल के लिए रूपों, यह अन्य तो सवाल चेकआउट करें: Django: multiple models in one template using forms, attached link जो थोड़ा पुराने, लेकिन अभी भी dryest तरह से इसे प्राप्त करने पर प्रासंगिक है नहीं भूल। यह सब यहाँ फिर से चर्चा करने के लिए बहुत लंबा है!

2)

  • क) नहीं! आपको मॉडल फॉर्म से अपना फॉर्म प्राप्त करना चाहिए जो आपके लिए model validation करेगा -> आपको मॉडल सत्यापन स्वयं को कॉल करने की आवश्यकता नहीं है
  • बी) नहीं! यदि आप किसी मॉडल को प्रमाणित करना चाहते हैं तो आपको इसे आजमाएं और सहेजना नहीं चाहिए; आपको full_clean का उपयोग करना चाहिए -> यदि आपका मॉडलफॉर्म मान्य है, तो आप जानते हैं कि मॉडल भी वैध है और आप सहेज सकते हैं।

और हाँ, ये उत्तर अभी भी बहु-मॉडल रूपों के साथ भी लागू होते हैं।

तो क्या आपको क्या करना चाहिए है:

  • फिर भी ModelForm
  • का उपयोग एक मॉडल सत्यापित करने के बारे में चिंता मत करो, क्योंकि एक ModelForm आपके लिए क्या कर सकते हैं।

सामान्य रूप से यदि आप खुद को डीजेंगो के साथ कुछ नलसाजी करते हैं तो ऐसा इसलिए होता है क्योंकि ऐसा करने का दूसरा, सरल तरीका है!

2 सूचक आप आरंभ करना चाहिए और वास्तव में अपने कोड एक बहुत आसान बनाने ...

+0

भाग 1 के बारे में कैसे?) – KobeJohn

+0

भाग 2 के लिए), मुझे बेहतर समझने के लिए कुछ बिंदुओं के साथ प्रतिक्रिया दें। ए) इस मामले में, हाँ, मैं एक मॉडलफॉर्म का अधिक स्पष्ट रूप से उपयोग कर सकता हूं। हालांकि, मुझे यह कहना चाहिए था कि मेरे पास ऐसे रूप हैं जो कई मॉडलों को शामिल करते हैं, इसलिए मॉडलफॉर्म उचित नहीं होगा? इस मामले में, जिस तरह से मैंने ठीक किया? बी) पर्याप्त मेला। मैं अब तक इसे बचाने में पसंद करता हूं, यह एकमात्र संयोजन है जिसे मैंने पाया है। अगर कोई समस्या नहीं है तो full_clean बचाओ। इसलिए मैंने उन्हें हर क्षेत्र में याद रखने की बजाय उन्हें संयुक्त किया। मैंने सोचा और अधिक डॉ। – KobeJohn

+0

@yakiimo आशा है कि मैंने आपके अतिरिक्त प्रश्नों का उत्तर दिया – Stefano

4

1) हाँ, यह मॉडल पर सत्यापन करने के लिए पूरी तरह से वैध है। यही कारण है कि Django लोगों ने इसे जोड़ा। मॉडल को हमेशा सहेजने की प्रक्रिया में प्रपत्रों का उपयोग नहीं किया जाता है, इसलिए यदि सत्यापन केवल फ़ॉर्म के माध्यम से किया जाता है, तो आपको समस्याएं आती हैं। बेशक, लोगों ने अतीत में इस सीमा के आसपास save विधि को ओवरराइड करके और उस तरह से सत्यापन सहित ओवरराइड किया। हालांकि, नया मॉडल सत्यापन अधिक अर्थपूर्ण है और वास्तव में एक फॉर्म का उपयोग करते समय आपको सत्यापन प्रक्रिया में एक हुक देता है।

2) दस्तावेज़ स्पष्ट रूप से कहते हैं कि मॉडल सत्यापन (full_clean) चलाया जाता है जब ModelForm.is_valid कहा जाता है। हालांकि, अगर आप ModelForm का उपयोग नहीं करते हैं या अतिरिक्त प्रसंस्करण करना चाहते हैं, तो आपको मैन्युअल रूप से full_clean पर कॉल करने की आवश्यकता है। आप ऐसा कर रहे हैं, लेकिन इसे एक ओवरराइड save में डालना गलत दृष्टिकोण है। याद रखें: "स्पष्ट से स्पष्ट स्पष्ट है।" इसके अलावा, save को कई अन्य स्थानों और तरीकों से बुलाया जाता है, और मॉडलफॉर्म के मामले में, आप वास्तव में full_clean को इस तरह से दो बार चलाना बंद कर देंगे।

यह कहा गया है कि चूंकि दस्तावेज़ कहते हैं कि ModelFormfull_clean स्वचालित रूप से करता है, मुझे लगा कि यह समझ में आता है कि यह त्रुटियों को कैसे संभालता है। _post_clean विधि में, django.forms.models की लाइन 323 से शुरू होने वाले:

# Clean the model instance's fields. 
try: 
    self.instance.clean_fields(exclude=exclude) 
except ValidationError, e: 
    self._update_errors(e.message_dict) 

# Call the model instance's clean method. 
try: 
    self.instance.clean() 
except ValidationError, e: 
    self._update_errors({NON_FIELD_ERRORS: e.messages}) 

बारी में, एक ही मॉड्यूल की लाइन 248 पर _update_errors शुरू होता है के लिए कोड:

def _update_errors(self, message_dict): 
    for k, v in message_dict.items(): 
     if k != NON_FIELD_ERRORS: 
      self._errors.setdefault(k, self.error_class()).extend(v) 
      # Remove the data from the cleaned_data dict since it was invalid 
      if k in self.cleaned_data: 
       del self.cleaned_data[k] 
    if NON_FIELD_ERRORS in message_dict: 
     messages = message_dict[NON_FIELD_ERRORS] 
     self._errors.setdefault(NON_FIELD_ERRORS, self.error_class()).extend(messages) 

आप के साथ खेलने के लिए होगा कोड थोड़ा सा है, लेकिन यह आपको फ़ॉर्म और मॉडल सत्यापन त्रुटियों के संयोजन के लिए एक अच्छा प्रारंभिक बिंदु देना चाहिए।

+0

ModelForm के लिए स्रोत कोड को देखने पर अच्छा कॉल। यह मेरे दिमाग को पार कर गया था और बाद में इसे पारित कर दिया। मैं अब इसमें देख लूंगा। आपके उत्तर के सभी भागों के लिए धन्यवाद। – KobeJohn

+0

देव कोड को देखने और आगे देखने के बाद, यह मेरे कौशल स्तर पर खुद को लटका देने के लिए पर्याप्त रस्सी से अधिक दिखता है। उम्मीद है कि संयुक्त रूप काम करेंगे। उत्तर और लीड के लिए फिर से धन्यवाद। – KobeJohn

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