2013-02-26 14 views
14

मैं लॉगिन/पासवर्ड प्रपत्र बनाने:Django। लॉगिन फार्म के लिए त्रुटि संदेश

मॉडल:

class LoginForm(forms.Form): 
username = forms.CharField(max_length=100) 
password = forms.CharField(widget=forms.PasswordInput(render_value=False),max_length=100) 

दृश्य:

def login_view(request): 
    if request.method == 'POST': 
     username = request.POST['email'] 
     password = request.POST['password'] 
     user = authenticate(username=username, password=password) 
     if user is not None and user.is_active: 
      login(request, user) 
      return HttpResponseRedirect("/n1.html")# Redirect to a success page. 
     return HttpResponseRedirect("/login") 
    form=LoginForm() 
    return render(request, 'enter.html', {'login_form': LoginForm}) 

यूआरएल:

(r'^login/$', login_view), 

टेम्पलेट:

{% if form.errors %} 
<p>Something is wrong</p> 
{% endif %} 

<form class="form-signin" action="" method="post"> 
    <h2 class="form-signin-heading">Login</h2> 
    {% csrf_token %} 

    <input class="input-block-level" type="text" name="email" value="" id="email" placeholder="Email"> 

    <input class="input-block-level" type="password" name="password" value="" id="username" placeholder="Password"> 

    <button class="btn btn-large btn-primary" type="submit">Login</button> 
    <input type="hidden" name="next" value="{{next|escape}}" /> 

</form> 

मैं लॉगिन पेज पर रीडायरेक्ट का उपयोग करता हूं, फिर लॉगिन या पासवर्ड गलत है, लेकिन मैं इस मामले में त्रुटि संदेश बनाना चाहता हूं। निर्माण {% अगर form.errors%} क्यों काम नहीं करता है? धन्यवाद!

+2

नहीं के रूप में प्रदान की गई की जा रही है अपनी 'HttpResponseRedirect'। – arulmr

+0

form.errors को ट्रिगर करने के लिए फॉर्म का उपयोग करें – catherine

उत्तर

43

क्योंकि फ़ॉर्म को पता नहीं है कि कोई त्रुटि हुई है।

जब आप प्रपत्र यहाँ का निर्माण:

form=LoginForm() 

आप इसे किसी भी जानकारी से गुजर बिना यह निर्माण कर रहे हैं। यह उपयोगकर्ता द्वारा किए गए POST के बारे में कुछ भी नहीं जानता है, या लॉगिन विफल हुआ है, या पासवर्ड गुम है, या जो भी त्रुटि थी।

class LoginForm(forms.Form): 
    username = forms.CharField(max_length=255, required=True) 
    password = forms.CharField(widget=forms.PasswordInput, required=True) 

    def clean(self): 
     username = self.cleaned_data.get('username') 
     password = self.cleaned_data.get('password') 
     user = authenticate(username=username, password=password) 
     if not user or not user.is_active: 
      raise forms.ValidationError("Sorry, that login was invalid. Please try again.") 
     return self.cleaned_data 

    def login(self, request): 
     username = self.cleaned_data.get('username') 
     password = self.cleaned_data.get('password') 
     user = authenticate(username=username, password=password) 
     return user 

हम प्रपत्र के clean विधि ओवरराइड, ताकि यदि फ़ॉर्म सत्यापन गुजरता हम उपयोगकर्ता की साख की जांच कर सकते हैं:

यहाँ अपना लॉगिन रूपों की तरह लग रही है। हमने अपने व्यू क्लीनर को बनाने के लिए फॉर्म ऑब्जेक्ट पर एक लॉगिन विधि भी डाली है।

इसके बाद, हमारे ध्यान में रखते हुए, हम ऐसा करना चाहते हैं:

def login_view(request): 
    form = LoginForm(request.POST or None) 
    if request.POST and form.is_valid(): 
     user = form.login(request) 
     if user: 
      login(request, user) 
      return HttpResponseRedirect("/n1.html")# Redirect to a success page. 
    return render(request, 'enter.html', {'login_form': form }) 

हम प्रपत्र का दृष्टांत और यह हाथ request.POST के खिलाफ जांच करने के लिए।

यदि हमारे पास कोई पोस्ट है, तो हम जांचते हैं कि फॉर्म मान्य है या नहीं। फ़ॉर्म की "साफ" विधि कॉल की जाएगी, और हमारे लिए उपयोगकर्ता प्रमाण-पत्र जांचें।

यदि प्रमाण-पत्र विफल हो जाते हैं, तो हम एक त्रुटि उठाते हैं, जिसे हमें हमारे टेम्पलेट में दिखाने की आवश्यकता होती है।

त्रुटियाँ प्रपत्र द्वारा उठाए गए (लेकिन एक क्षेत्र से जुड़ी), non_field_errors में जमा हो जाती है जो इतना की तरह प्रदर्शित किया जा सकता:

{% if form.non_field_errors %} 
    <ul class='form-errors'> 
     {% for error in form.non_field_errors %} 
      <li>{{ error }}</li> 
     {% endfor %} 
    </ul> 
{% endif %} 
1

जब आप रीडायरेक्ट करते हैं, तो मुझे यकीन नहीं है कि आप अपने पृष्ठ का संदर्भ भेजते हैं। तो जब आप/लॉगिन/पेज पर रीडायरेक्ट करते हैं, तो django tinks यह एक नया रूप है जो लोड होता है।

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