2012-06-11 3 views
0

У меня есть страница регистрации со следующим кодом ниже:Джанго - форма проверка не показывать

в представлениях:

def register_step2(request, value): 
context={"type": value} 
if request.method == 'POST': 
    form = RegisterForm(request.POST) 
    if form.is_valid(): 
     nric = form.cleaned_data['nric'] 
     name = form.cleaned_data['name'] 
     password = form.cleaned_data['password'] 
     email = form.cleaned_data['email'] 
     phonenumber = form.cleaned_data['phonenumber'] 
     dob = form.cleaned_data['dob'] 
     User.objects.create_user(nric, email, password) 
     return HttpResponseRedirect('/') 
return render_to_response('register.html', context, RequestContext(request)) 

в register.html:

{% extends "base.html" %} 
{% block subheader %} 
{% if type == '0' %} 
Are you.. 
{% endif %} 
{% if type == '1' %} 
Registration - Able Elder 
{% endif %} 
{% if type == '2' %} 
Registration - Public 
{% endif %} 
{% endblock %} 

{% block content %} 
{% if type == '0' %} 
<a href="/register/1">an elderly looking for something to do?</a> 
<a href="/register/2">the public looking for someone to help you?</a> 
{% else %} 
<form action="/register/{{type}}/" method="post">{% csrf_token %} 
<table class="center"> 
{% for field in able_form %} 
<tr> 
    <td> 
     {{ field.label_tag }}: 
    </td> 
    <td> 
    {{ field.errors }} 
    {{ field }} 
    </td> 
</tr> 
{% endfor %} 
<tr> 
<td> 
{{ able_form.non_field_errors }} 
</td> 
</tr> 
<tr> 
<td colspan="2"> 
By clicking on "register" I agree with the terms and conditions. 
</td> 
</tr> 
<tr> 
<td colspan="2"> 
<input type="submit" value="register"> 
</form> 
</td> 
{% endif %} 
{% endblock %} 

в context_processors .py (он правильно настроен в settings.py)

from forms import RegisterForm 

def able_form(request): 
    return { 
      'able_form' : RegisterForm()} 

в forms.py

class RegisterForm(forms.Form): 
    nric = forms.CharField(max_length=NAME_MAX) 
    name = forms.CharField(max_length=NAME_MAX) 
    password = forms.CharField(widget=forms.PasswordInput) 
    confirm_password = forms.CharField(widget=forms.PasswordInput) 
    email = forms.EmailField() 
    postal_code = forms.IntegerField() 
    phone_number = forms.IntegerField() 
    date_of_birth = forms.DateField(widget=forms.DateInput) 

Он заключается в моем понимании, что переменные поля будут отображать ошибки поля, но ни один не показан при нажатии на кнопку регистра. Что я здесь делаю неправильно?

+0

Я не вижу формы, передаваемой в контекст шаблона вообще .. откуда появляется 'able_form'? –

+0

форма может отображаться правильно. Я обновлю свой вопрос – causztic

ответ

2

С вашим обновлением, причина очевидна:

Вы только когда-либо пропусканием пустой формы в шаблон.

Где вы думаете, что связанная форма с данными request.POST возвращается в ваш шаблон? Создание нового экземпляра RegisterForm(request.POST) не волшебным образом изменяет экземпляр формы в вашем шаблоне (возвращается обработчиком контекста).

Ваш шаблон только когда-либо видит RegisterForm() - если он должен знать об ошибке формы, он должен иметь форму, связанную с данными request.POST.

form = RegisterForm(request.POST) 
    if form.is_valid(): 
     .... 
    context['able_form'] = form # you must pass back the bound form if you want to see errors. 
return render_to_response('register.html', context, RequestContext(request)) 

Даже тогда, процессор контекста может переопределить этот able_form ключ - я бы удалить контекст процессора в целом.

Если вы считаете, что это отличная идея, чтобы иметь его, то вы должны помнить о том, чтобы делать свою логику формы там или по вашему мнению.

+0

Спасибо! который зафиксировал это. Я оставил там процессор контекста, и он все еще работает отлично. :) Я забыл передать связанную форму обратно в контекст. – causztic

+0

Yuji - thx, как для ответа, так и для логики - у меня была такая же проблема, но теперь понимаю почему. –

Смежные вопросы