2010-03-12 13 views
6

जब एक फॉर्म क्लीन विधि को ओवरराइट करते हैं तो आप कैसे जानते हैं कि किसी भी फ़ील्ड पर इसकी विफलता वैध है या नहीं? जैसे नीचे दिए गए फॉर्म में यदि मैं साफ विधि को ओवरराइट करता हूं तो मुझे कैसे पता चलेगा कि फ़ॉर्म किसी भी फ़ील्ड पर सत्यापन विफल रहा है या नहीं?django फॉर्म क्लीन विधि को ओवरराइट करें

class PersonForm(forms.Form): 
    title = Forms.CharField(max_length=100) 
    first_name = Forms.CharField(max_length=100) 
    surname = Forms.CharField(max_length=100) 
    password = Forms.CharField(max_length=100) 

def clean(self, value): 
    cleaned_data = self.cleaned_data 

    IF THE FORM HAS FAILED VALIDATION: 
     self.data['password'] = 'abc' 
     raise forms.ValidationError("You have failed validation!") 
    ELSE: 
     return cleaned_data 

धन्यवाद

उत्तर

10

आप देख सकते हैं किसी भी त्रुटि त्रुटि dict में जोड़ा गया है:

def clean(self, value): 
    cleaned_data = self.cleaned_data 

    if self._errors: 
     self.data['password'] = 'abc' 
     raise forms.ValidationError("You have failed validation!") 
    else: 
     return cleaned_data 

बोनस! आप विशिष्ट क्षेत्रों पर त्रुटियों की जांच कर सकते हैं:

def clean(self, value): 
    cleaned_data = self.cleaned_data 

    if self._errors and 'title' in self._errors: 
     raise forms.ValidationError("You call that a title?!") 
    else: 
     return cleaned_data 
+1

हाय मार्क मैं वास्तव में इस प्रक्रिया का उपयोग कर रहा हूं हालांकि प्रमाणीकरण त्रुटि व्यवस्थापक (change_form) पृष्ठ के शीर्ष पर प्रदर्शित हो रही है, मैं उस फ़ील्ड के ऊपर त्रुटि संदेश कैसे प्रदर्शित कर सकता हूं जिसके लिए मैं सत्यापन लागू कर रहा हूं। अग्रिम धन्यवाद –

+1

ऐसा करने का सबसे आसान तरीका है अपने क्षेत्र के लिए 'clean_ ' के अंदर सत्यापन त्रुटि को बढ़ाने के लिए। Https://docs.djangoproject.com/en/1 देखें।4/रेफ/फॉर्म/सत्यापन/ –

+1

हाय मार्क मैंने इस raise फॉर्म को लिखा है। वैधता त्रुटि ({'साक्षात्कार_ प्रकार': ["त्रुटि संदेश",]}) लेकिन यह मुझे change_form के शीर्ष पर त्रुटि संदेश दिखा रहा है। क्या आप बता सकते हैं मुझे इसमें क्या संशोधित करना चाहिए। –

4

अपने डेटा को मान्य नहीं करता है, तो अपने फार्म उदाहरण एक cleaned_data विशेषता

Django Doc on Accessing "clean" data

उपयोग self.is_valid() नहीं होगा।

+0

तो मैं सिर्फ cleaned_data उदा पर एक चेक करना होगा अगर self.cleaned_data: #do कुछ – John

+0

नहीं, विशेषता मौजूद नहीं है, तो आपको एक विशेषता प्राप्त होगी। मैंने अपना जवाब बढ़ाया। – stefanw

0

यहाँ Loing पृष्ठ की आवश्यकता होती है कि केवल अनाम उपयोगकर्ता को ले django.forms.Form में clean() अधिभावी और भी AnonymousRequiredMixin के लिए django-braces का उपयोग करने का एक सरल उदाहरण है:

class LoginView(AnonymousRequiredMixin, FormView): 
    """ 
    Main Login. And Social Logins 
    """ 
    template_name = 'core/login.html' 
    form_class = LoginForm 
    success_url = reverse_lazy('blog:index') 

    def get_success_url(self): 
     try: 
      next = self.request.GET['next'] 
     except KeyError: 
      next = self.success_url 
     return next 

    def form_valid(self, form): 
     cd = form.cleaned_data 
     user = auth.authenticate(username=cd['login_username'], 
      password=cd['login_password']) 
     if user: 
      auth.login(self.request, user) 
      messages.info(self.request, 'You are logged in.') 
     return super(LoginView, self).form_valid(form) 
0

हालांकि इसकी पुरानी पोस्ट, यदि आप एक ही फॉर्म/मॉडलफॉर्म के 0 से अधिक फ़ील्ड पर सत्यापन लागू करना चाहते हैं तो clean() का उपयोग करें। यह विधि cleaned_data शब्दकोश देता है।

उपयोगकर्ताओं को त्रुटियों को दिखाने के लिए आप add_error(<fieldname>, "your message") विधि का उपयोग कर सकते हैं। यह फॉर्म के शीर्ष पर फ़ील्ड नाम के साथ त्रुटियों को दिखाएगा। उदाहरण नीचे दिखाया गया है:

add_error() स्वचालित रूप से cleaned_data शब्दकोश से फ़ील्ड को हटा देता है, आपको इसे मैन्युअल रूप से हटाने की आवश्यकता नहीं है। इसके अलावा आपको इसका उपयोग करने के लिए कुछ भी आयात नहीं करना है।

documentation is here

def clean(self): 

    if self.cleaned_data['password1'] != self.cleaned_data['password2']: 
    msg = 'passwords do not match' 
    self.add_error('password2', msg) 

    return self.cleaned_data 

तुम सिर्फ प्रपत्र/modelform उपयोग clean_<fieldname>() के एकल मैदान पर मान्यता चाहते हैं। यह विधि क्लीनेड_डाटा शब्दकोश से मान लेगी और फिर आप तार्किक त्रुटियों की जांच कर सकते हैं। लॉजिक की जांच करने के बाद हमेशा मूल्य वापस करें।

def clean_password(self): 

    password = self.cleaned_data['password'] 

    if len(password)<6: 
    msg = 'password is too short' 
    self.add_error('password', msg) 

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