2010-10-22 16 views
14

मॉडल के मेटा क्लास में, मैं एक अद्वितीय_एक साथ परिभाषित करता हूं। मेरे पास इस मॉडल के आधार पर एक मॉडलफॉर्म है। जब मैं इस मॉडलफॉर्म पर is_valid को कॉल करता हूं, तो अद्वितीय त्रुटि एक साथ विफल होने पर एक त्रुटि स्वचालित रूप से उठाई जाएगी। यह सब अच्छा है।Django: अद्वितीय त्रुटि संदेश को ओवरराइड कैसे करें?

अब मेरी समस्या यह है कि मैं डिफ़ॉल्ट अद्वितीय_एक साथ त्रुटि संदेश से संतुष्ट नहीं हूं। मैं इसे ओवरराइड करना चाहता हूं। मैं उसे कैसे कर सकता हूँ? फ़ील्ड से संबंधित त्रुटि के लिए, मैं फ़ील्ड पैरामीटर पर error_messages को सेट करके आसानी से ऐसा कर सकता हूं। लेकिन अद्वितीय_एक साथ एक गैर क्षेत्र त्रुटि है। मैं एक गैर फील्ड त्रुटि संदेश को ओवरराइड कैसे कर सकता हूं?

+0

मैं आप बेहतर निशान लगता है Django 1.7 ने महत्वपूर्ण परिवर्तन किए हैं, जो मेरे जवाब को प्रभावित करते हैं, क्योंकि मेरे बजाय स्वीकार्य एक और जवाब। – FallenAngel

उत्तर

27

आप Django में this कर सकते हैं 1,7

from django.forms import ModelForm 
from django.core.exceptions import NON_FIELD_ERRORS 

class ArticleForm(ModelForm): 
    class Meta: 
     error_messages = { 
      NON_FIELD_ERRORS: { 
       'unique_together': "%(model_name)s's %(field_labels)s are not unique.", 
      } 
     } 
+1

बहुत सेक्सी दिखता है;) – andi

+0

यह भी बेहतर है! –

+1

एक महत्वपूर्ण नोट: आपको 'django.core.exceptions' से' NON_FIELD_ERRORS' आयात करना होगा। –

1

एक त्वरित जांच के बाद, ऐसा लगता है कि unique_together सत्यापन त्रुटियों हार्ड-कोडेड django.db.models.Model.unique_error_message में गहरी हैं:

def unique_error_message(self, model_class, unique_check): 
    opts = model_class._meta 
    model_name = capfirst(opts.verbose_name) 

    # A unique field 
    if len(unique_check) == 1: 
     field_name = unique_check[0] 
     field_label = capfirst(opts.get_field(field_name).verbose_name) 
     # Insert the error into the error dict, very sneaky 
     return _(u"%(model_name)s with this %(field_label)s already exists.") % { 
      'model_name': unicode(model_name), 
      'field_label': unicode(field_label) 
     } 
    # unique_together 
    else: 
     field_labels = map(lambda f: capfirst(opts.get_field(f).verbose_name), unique_check) 
     field_labels = get_text_list(field_labels, _('and')) 
     return _(u"%(model_name)s with this %(field_label)s already exists.") % { 
      'model_name': unicode(model_name), 
      'field_label': unicode(field_labels) 
     } 

तो हो सकता है आप अपना खुद का संदेश डालने के लिए अपने मॉडल से इस विधि ओवरराइड करने के लिए, की कोशिश करनी चाहिए?

हालांकि, मैंने कोशिश नहीं की है, और यह एक क्रूर समाधान लगता है! लेकिन अगर आपके पास कुछ बेहतर नहीं है, तो आप कोशिश कर सकते हैं ...

+1

हां, यह कड़ी मेहनत है। घृणा करता हूं। डीजेंगो टीम को गैर क्षेत्र त्रुटि संदेश ओवरराइड करने वाले डेवलपर के परिदृश्य पर विचार करना चाहिए था। –

0

नोटिस: इस उत्तर के बाद से Django में बहुत कुछ बदल गया था। तो बेहतर अन्य उत्तर जाँच ...

यदि sebpiq सच (के बाद से मैं स्रोत कोड की जांच नहीं करते हैं) है, तो वहाँ एक संभव समाधान आप कर सकते है, लेकिन यह मुश्किल तरीके से है ...

आप अपने रूप में एक मान्यता नियम बना सकते हैं, as it described here

आप एक से अधिक क्षेत्र के साथ सत्यापन के examples देख सकते हैं, तो यह विधि का उपयोग कर, आप एक साथ एक अद्वितीय को परिभाषित करने से पहले मानक Django अद्वितीय जांच निष्पादित जांच कर सकते हैं ...

या सबसे खराब, आप अपने वी में एक सत्यापन कर सकते हैं ऑब्जेक्ट्स को सहेजने का प्रयास करने से पहले देखें ...

+0

यह Django> = 1.7 – nuts

-1

आप अपने मॉडल में django/db/models/base.py:Model._perform_unique_checks() ओवरराइड करने पर एक नज़र डाल सकते हैं।

कि विधि आप "मूल" त्रुटियों प्राप्त कर सकते हैं में:

errors = super(MyModel, self)._perform_unique_checks(unique_checks) 

- तो संशोधित करने और उन्हें ऊपर की तरफ लौट आते हैं।

+0

के लिए अब सत्य नहीं है इस तरह "निजी" विधियों को ओवरराइड करना बहुत जोखिम भरा है। आप कभी नहीं जानते कि वे कब बदल सकते हैं या गायब हो सकते हैं – richard

24

अद्यतन 2016/10/20: jifeng-yin के देखें Django के लिए नीचे भी अच्छे जवाब> = 1.7

ये त्रुटि संदेश ओवरराइड करने के लिए अपने मॉडल पर unique_error_message विधि ओवरराइड करने के लिए हो सकता है सबसे अच्छा तरीका है। Django इस विधि को त्रुटि संदेश प्राप्त करने के लिए कहते हैं जब भी सत्यापन के दौरान एक विशिष्टता समस्या का सामना करना पड़ता है।

तुम बस विशिष्ट मामले में आप चाहते संभालने के लिए और अन्य सभी मामलों हमेशा की तरह Django द्वारा नियंत्रित किया जा कर सकते हैं:

def unique_error_message(self, model_class, unique_check): 
    if model_class == type(self) and unique_check == ('field1', 'field2'): 
     return 'My custom error message' 
    else: 
     return super(Project, self).unique_error_message(model_class, unique_check) 
+0

यह एक समाधान से मेल खाता है जिसे मैंने [ब्लॉग] (http://chriskief.com/2013/11/20/customize-djangos-unique_together-error-message/) पर पोस्ट किया था। लेकिन मेरे पास एक सवाल है ... हमें यह जांचने की ज़रूरत क्यों है कि 'model_class' प्रकार' self' है या नहीं? – HorseloverFat

+0

यह वास्तव में अब "सबसे अच्छा" तरीका नहीं है। कम से कम Django> = 1.7 के लिए। देखें @ jifeng.yin का जवाब – nuts

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