2011-01-13 13 views
10

एक दृश्य के समारोह में, मैं कुछ की तरह है: [u'Empty URL']Django में, मैं अपवाद का संदेश कैसे प्राप्त कर सकता हूं?

जब मैं अपने टेम्पलेट (एक dict में भरवां करने के लिए त्रुटि संदेश पारित करने के लिए प्रयास करते हैं, कुछ { 'error_message': err.value } की तरह:

try: 
    url = request.POST.get('u', '') 
    if len(url) == 0: 
     raise ValidationError('Empty URL') 
except ValidationError, err: 
    print err 

उत्पादन एक स्ट्रिंग है), टेम्पलेट सफलतापूर्वक संदेश प्राप्त करता है ({{ error_message }} का उपयोग कर)।

समस्या यह है कि मुझे [u'...'] के साथ, [u'Empty URL'] के समान सटीक स्ट्रिंग मिलती है!

मैं इससे कैसे छुटकारा पा सकता हूं?

(पायथन 2.6.5, Django 1.2.4, Xubuntu 10,04)

उत्तर

12

ValidationError वास्तव में कई त्रुटि संदेश रखता है।

print err के उत्पादन [u'Empty URL'] है, क्योंकि है कि स्ट्रिंग repr(err.messages) द्वारा दिया है (ValidationError.__str__ स्रोत कोड देखें)।

आप एक ValidationError से बाहर एक भी पठनीय संदेश प्रिंट करना चाहते हैं, तो आप, त्रुटि संदेशों में से सूची जोड़ सकते हैं उदाहरण के लिए:

print '; '.join(err.messages) 
+0

मुझे लगा कि, एक फ़ील्ड के लिए वैधकर्ता भी एक सरणी है। 'प्रमाणीकरण त्रुटि' के 'संदेश' सदस्य के बारे में जानना अच्छा है। उन्होंने इसे यहां कभी भी उल्लेख नहीं किया है: https://docs.djangoproject.com/en/dev/ref/forms/validation/ जैसा कि उन्हें मुख्य रूप से करना चाहिए! –

-2

मैं इसे BaseException करने के लिए ValidationError बदलकर तय की।

+1

कि वास्तव में बुरा व्यवहार मैं कहेंगे। बेसएक्सप्शन सब कुछ पकड़ता है, जबकि आपको केवल सत्यापन प्रमाणीकरण को संभालना चाहिए। यदि कोई अन्य अपवाद पॉप करता है क्योंकि आपके कोड में कोई त्रुटि है, जिसे ठीक किया जाना चाहिए। – Fred

+0

ठीक है, मैंने स्वयं त्रुटि/अपवाद उठाया है। 'Try' block में कोड _very_ न्यूनतम था, मैंने सोचा कि एक अलग तरह की त्रुटि पॉपिंग की संभावना पतली थी। मैं सिर्फ अर्थपूर्ण उद्देश्यों के लिए 'सत्यापनकरण' का पुन: उपयोग करना चाहता था। मुझे लगता है कि 'बेसएक्सप्शन' को अपनी खुद की सत्यापन त्रुटि के साथ उपरोक्त करने के लिए और अधिक उचित दृष्टिकोण होगा? किसी भी मामले में, कोड ने बहुत कुछ बदल दिया है क्योंकि मैंने इसे पहले पोस्ट किया था और मेरा कामकाज अब लागू नहीं है, इसलिए मैंने इसके बजाय उत्तर स्वीकार कर लिया है। –

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