2013-07-27 2 views
5
https://docs.djangoproject.com/en/dev/ref/forms/validation/

Django ValidationError

# Good 
    ValidationError(
     _('Invalid value: %(value)s'), 
     params={'value': '42'}, 
    ) 

    # Bad 
    ValidationError(_('Invalid value: %s') % value) 

डॉक्स वास्तव में does not स्पष्टीकरण दें कि यह बुरा है/अच्छा के अनुसार

। क्या कोई ठोस उदाहरण दे सकता है?

इसके अलावा, जब मैं form.errors का निरीक्षण करता हूं, तो मुझे 'Invalid: %(value)s' जैसे कुछ मिलता है। मैं सत्यापन त्रुटियों से पैरा कैसे प्राप्त करूं और उन्हें त्रुटि संदेश में विभाजित कर सकता हूं?

संपादित

तो यह अच्छा माना जाता है?

ValidationError(
     _('Invalid value: %(value)s') % {'value': '42'}, 
    ) 

मुझे लगता है कि असली सवाल यह है: क्यों params तर्क के माध्यम से अलग-अलग चर पारित? त्रुटि संदेश में सीधे इंटरपोलेट क्यों न करें (नाम के लिए नाम या स्थितिगत इंटरपोलेशन को अनदेखा करें) ???

संपादित

ठीक है, स्रोत @https://github.com/django/django/blob/stable/1.5.x/django/forms/forms.py मुझे नहीं लगता कि वहाँ के बाद से फार्म करता भी ValidationError वस्तु ही नहीं बचा ValidationError के पैरामीटर को पुनः प्राप्त करने के लिए किसी भी तरह से है से। नीचे कोड देखें।

class ValidationError(Exception): 
    """An error while validating data.""" 
    def __init__(self, message, code=None, params=None): 
     import operator 
     from django.utils.encoding import force_text 
     """ 
     ValidationError can be passed any object that can be printed (usually 
     a string), a list of objects or a dictionary. 
     """ 
     if isinstance(message, dict): 
      self.message_dict = message 
      # Reduce each list of messages into a single list. 
      message = reduce(operator.add, message.values()) 

     if isinstance(message, list): 
      self.messages = [force_text(msg) for msg in message] 
     else: 
      self.code = code 
      self.params = params 
      message = force_text(message) 
      self.messages = [message] 

class Form: 
    .... 
    def _clean_fields(...): 
     .... 
     except ValidationError as e: 
      self._errors[name] = self.error_class(e.messages) # Save messages ONLY 
      if name in self.cleaned_data: 
       del self.cleaned_data[name] 

उत्तर

2

यदि आपके पास एकाधिक पैरामीटर हैं, तो जब आप त्रुटि संदेश का अनुवाद करते हैं तो वे एक अलग क्रम में प्रकट हो सकते हैं।

नामांकित तर्क आपको params को बदले बिना तर्कों को बदलने के क्रम में बदलने की अनुमति देते हैं। तर्कों के एक झुकाव के साथ, आदेश तय किया गया है।

ध्यान दें कि आप Django दस्तावेज़ों के विकास संस्करण से जुड़ रहे हैं। सत्यापन त्रुटि पैरामीटर को अलग नहीं कर रही है क्योंकि आप Django 1.5 या इससे पहले का उपयोग कर रहे हैं। यदि आप 1.6 बीटा में अपना कोड आज़माते हैं, तो पैरामीटर त्रुटि संदेश में इंटरपोलेट किए जाते हैं।

+0

तो मेरे सवाल क्यों उपयोग नहीं 'ValidationError ( _ (है ओवरराइड करने के लिए में 'अवैध मान:% (मूल्य) s')% { 'मूल्य ':' 42 '}, ) ' – Lucas

+0

कृपया मेरे संपादन को – Lucas

+0

से ऊपर देखें यदि आप सीधे संदेश में चर को जोड़ते हैं, तो इसे ओवरराइड करना कठिन होता है। उदाहरण के लिए, आप ['error_messages'] (https://docs.djangoproject.com/en/1.5/ref/forms/fields/#error-messages) तर्क का उपयोग करते समय प्लेसहोल्डर का उपयोग करने में सक्षम नहीं होंगे। – Alasdair

2

ValidationError फॉर्म सत्यापन दिनचर्या द्वारा पकड़ा जाता है और हालांकि यह केवल एक संदेश दिखा सकता है, params त्रुटि की संभावना को सहेजना बेहतर है; जैसे। फ़ील्ड नाम, मान जो त्रुटि उत्पन्न करता है और इसी तरह। यह आपके द्वारा प्रदान किए गए उदाहरण से ठीक पहले कहा गया है।

क्रम त्रुटि संदेश लचीला और आसान बनाने के लिए

+0

कृपया मेरे संपादन को ऊपर देखें – Lucas