2010-07-12 10 views
12

क्या मैं कुछ गलत कर रहा हूं, या यह गंभीरता से क्या डेवलपर मुझे हर बार लिखने की उम्मीद करते हैं कि मैं यह जांचना चाहता हूं कि दो फ़ील्ड समान हैं या नहीं?क्यों Django में दो पासवर्ड मेल खाते हैं तो जांच कर रहा है?

def clean(self): 
    data = self.cleaned_data 
    if "password1" in data and "password2" in data: 
     if data["password1"] != data["password2"]: 
      self._errors["password2"] = self.error_class(['Passwords do not match.']) 
      del data['password2']  
    return data 

और मुझे यह सत्यापित करना क्यों है कि उपयोगकर्ता नाम अद्वितीय है?

def clean_username(self): 
    data = self.cleaned_data['username'] 
    if User.objects.filter(username=data).exists(): 
     raise ValidationError('Username already taken.') 
    return data 

यह ModelForm है। यह पहले से ही पता होना चाहिए कि एक अद्वितीय बाधा है?

उत्तर

26

यहाँ मैं क्या कर सकता:

यह केवल स्वच्छ विधि है आपको यह सुनिश्चित करने के लिए परिभाषित करने की आवश्यकता है कि 2 पासवर्ड सही हैं और उपयोगकर्ता नाम मान्य है।

clean_fieldname विधि का उपयोग करें ताकि आपको उपयोगकर्ता नाम सत्यापित करने के लिए और अधिक काम करने की आवश्यकता न हो।

def clean_password2(self): 
    password1 = self.cleaned_data.get('password1') 
    password2 = self.cleaned_data.get('password2') 

    if not password2: 
     raise forms.ValidationError("You must confirm your password") 
    if password1 != password2: 
     raise forms.ValidationError("Your passwords do not match") 
    return password2 

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

आपके कोड के साथ समस्या यह है कि आप clean() विधि को ओवरराइड कर रहे हैं, जिसका अर्थ है कि मॉडलफॉर्म अपना 'असली' साफ नहीं कर रहा है।

डिफ़ॉल्ट सत्यापन प्राप्त करने के लिए, super(MyForm, self).clean() पर कॉल करें या बेहतर अभी तक clean ओवरराइड न करें और केवल clean_password2 निर्दिष्ट करें।

+0

मुझे लगता है कि यह निष्कर्ष है कि मैं अंत में भी आया, धन्यवाद। इस सवाल के बारे में भूल गए :) – mpen

+0

ओउप्स, मुझे नहीं पता था कि यह इतना पुराना था: डी –

+0

अभी भी अच्छा है कि आपने इसका उत्तर दिया :) – GreenAsJade

1

आप पहले if के लिए else: भाग जोड़ना चाहते हैं। वर्तमान में फ़ंक्शन data को किसी भी त्रुटि को सेट किए बिना लौटाता है, भले ही पासवर्ड में से कोई अनुपस्थित है - क्या वह इच्छित व्यवहार है?

else: 
    self._errors["password"] = self.error_class(['One or both of the passwords not found']) 

if "password1" in data and "password2" in data: यह सुनिश्चित करता है कि दोनों पासवर्ड मौजूद हैं। इस लाइन के बिना, आपको अगली पंक्ति में एक त्रुटि मिलेगी जहां आप data[password1] और data[password2] पढ़ते हैं यदि इनमें से कोई भी मौजूद नहीं है।

अगली तीन पंक्तियां पासवर्ड की तुलना करें और उपयुक्त त्रुटि संदेश सेट करें - यह आवश्यक है, है ना?

जैसा कि वे कहते हैं, चीजों को यथासंभव सरल बनाएं, अब और नहीं।

+0

मुझे लगता है * यह आवश्यक नहीं है ... अगर पासवर्ड अनुपस्थित है, तो इसका मतलब है कि पहले से ही एक त्रुटि हुई है, है ना? मुझे वास्तव में एक दूसरा फेंकने की ज़रूरत नहीं है। और हाँ, यह हास्यास्पद रूप से आसान हो सकता है। फ़ील्ड को परिभाषित करते समय, मैं 'password2 = पासवर्ड फ़ील्ड लिखता हूं (मान्य = बराबर ('पासवर्ड 1')) '? यह बाकी को समझने में सक्षम होना चाहिए। – mpen

4

सबसे पहले, क्या आप गंभीरता से बॉयलर-प्लेट कोड की चार पंक्तियों की शिकायत करते हैं? यदि यह वास्तव में आपको परेशान करता है, तो PasswordForm कक्षा बनाएं जिसमें उस स्वच्छ तर्क को शामिल किया गया हो और इसे अपने स्वयं के रूपों के लिए आवश्यक बनाएं।

दूसरे, आप नहीं मैन्युअल अद्वितीय की कमी को मान्य करने की क्या ज़रूरत है । जैसा कि आप कहते हैं, मॉडलफॉर्म आपके लिए करता है।

टिप्पणी

यह 'अजीब वाक्य रचना' के बाद संपादित करें क्योंकि यह जांच करना कि दो पासवर्ड फ़ील्ड मैच एक अलग प्रवाह चीजों की सामान्य योजना की तुलना में है। शुरुआत के लिए, आप फील्ड-विशिष्ट clean_myfield के बजाय मुख्य clean विधि में जांच कर रहे हैं। यदि यह उत्तरार्द्ध था, तो आप बस एक अपवाद उठाते हैं और Django वास्तव में फ़ील्ड डेटा को हटा देता है।

तो नहीं, यह प्रत्येक रूप पर 7 लाइन नहीं है - सबक्लासिंग के बारे में मेरा नोट देखें - और यह निश्चित रूप से 7 लाइनों के कई फ़ील्ड नहीं है, क्योंकि आप इसे किसी अन्य प्रकार के लिए नहीं करना चाहते हैं क्षेत्र का

+0

अच्छी तरह से कहीं कुछ खराब हो रहा है..क्योंकि मुझे अभी एक डुप्लिकेट कुंजी त्रुटि मिली है। मैं बस थोड़ा सा कुचलना चाहता था क्योंकि मैं इस परियोजना के बीमार पड़ रहा हूं :( – mpen

+0

और यह अजीब सिंटैक्स की 7 लाइनें है। मुझे यह जांचना है कि डेटा कब है और फिर इसे हटा दें? Isn यह एक अजीब डिज़ाइन का थोड़ा सा नहीं है? पहले से ही एक त्रुटि सूची है, यह जांच सकती है कि अगर यह जानना है कि कोई त्रुटि हुई है या नहीं। और मैं वास्तव में किसी अन्य को जोड़ने में सक्षम होना चाहिए, बिना किसी त्रुटि के पहले इसे पहले से ही एक त्रुटि मिली है और फिर डेटा क्यों लौटाते हैं? मैं पहले से ही आत्मनिर्भर कर रहा हूं .cleaned_data, यह वास्तव में कुछ भी वापस करने के लिए जरूरी नहीं लगता है। अगर उन्होंने मुझे निर्देश में पास किया, तो शायद – mpen

+0

और यह सिर्फ 7 लाइनें नहीं है .. यह प्रत्येक एकल फ्रेकिंग फॉर्म पर 7 लाइनें हैं, जो कई क्षेत्रों से गुणा हो जाती हैं। – mpen

4

http://k0001.wordpress.com/2007/11/15/dual-password-field-with-django/


संपादित करें: बाहर रास्ता मिल समस्या से व्यवस्थापक प्रपत्र सौदों: http://code.djangoproject.com/svn/django/trunk/django/contrib/auth/forms.py

class AdminPasswordChangeForm(forms.Form): 
    """ 
    A form used to change the password of a user in the admin interface. 
    """ 
    password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput) 
    password2 = forms.CharField(label=_("Password (again)"), widget=forms.PasswordInput) 

    def __init__(self, user, *args, **kwargs): 
     self.user = user 
     super(AdminPasswordChangeForm, self).__init__(*args, **kwargs) 

    def clean_password2(self): 
     password1 = self.cleaned_data.get('password1') 
     password2 = self.cleaned_data.get('password2') 
     if password1 and password2: 
      if password1 != password2: 
       raise forms.ValidationError(_("The two password fields didn't match.")) 
     return password2 

    def save(self, commit=True): 
     """ 
     Saves the new password. 
     """ 
     self.user.set_password(self.cleaned_data["password1"]) 
     if commit: 
      self.user.save() 
     return self.user 
संबंधित मुद्दे