【问题标题】:Django - Form Validation not showingDjango - 表单验证未显示
【发布时间】:2012-06-11 00:46:39
【问题描述】:

我有一个注册页面,代码如下:

在视图中:

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)

据我了解,变量字段会显示字段错误,但单击注册按钮时不会显示任何错误。我在这里做错了什么?

【问题讨论】:

  • 我根本没有看到一个表单被传递给模板上下文。able_form 来自哪里?
  • 表格可以正常显示。我会更新我的问题

标签: python django django-forms


【解决方案1】:

随着你的更新,原因很明显:

您只是将一个空白表单传递给您的模板。

您认为带有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 键 - 我会完全删除上下文处理器。

如果您认为拥有它是个好主意,那么您必须记住在那里或在您的视图中执行表单逻辑。

【讨论】:

  • 谢谢!解决了它。我将上下文处理器留在那里,它仍然可以正常工作。 :) 我忘了将绑定的表单传回上下文..
  • Yuji - 谢谢,对于答案和逻辑 - 我有同样的问题,但现在明白为什么了。
猜你喜欢
  • 2018-05-30
  • 2018-08-21
  • 1970-01-01
  • 2012-04-05
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 2013-12-08
相关资源
最近更新 更多