Django UserCreationForm既不提供错误消息也不注册用户

时间:2016-04-26 06:53:06

标签: python django python-2.7 python-3.x django-forms

我是python Django的初学者。并尝试在教程的帮助下构建一个发布文章网站。我被困在UserCreationForm。我使用UserCreationForm创建了一个表单,但是当我提交表单时,我既不能提交表单也不能在页面上收到任何错误消息。

我的 views.py 代码

 from django.shortcuts import render_to_response
 from django.contrib.auth import authenticate
 from django.http import HttpResponseRedirect
 from django.contrib import auth
 from django.template.context_processors import csrf
 from django.contrib.auth.forms import UserCreationForm

 def register_user(request):
     if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
           form.save()
           return HttpResponseRedirect('/accounts/register_success')

    args = {}
    args.update(csrf(request))

    args['form'] = UserCreationForm()
    print args
    return render_to_response('register.html', args)


 def register_success(request):
    return render_to_response('register_success.html')

register.html

 {% extends "base.html" %}

 {% block content %}

    <h2>Register</h2>
    <form action="/accounts/register/" method="post"> {% csrf_token %}

      {{form}}

      <input type="submit" value="Register"/>

   </form>

  {% endblock %}

register_success.html

  {% extends "base.hml" %}

  {% block content %}

   <h2>You have registered!</h2>
   <p>Click <a href="/accounts/login/">Here</a> to login again</p>

 {% endblock %}

2 个答案:

答案 0 :(得分:3)

问题是您始终在创建一个空白表单。

args['form'] = UserCreationForm()

这意味着当表单无效时,您没有看到POST请求的任何错误。

相反,您应该只为GET请求创建空白表单。

from django.shortcuts import render

def register_user(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
           form.save()
           return HttpResponseRedirect('/accounts/register_success')
    else:
        form = UserCreationForm()
    args = {'form': form}
    return render(request, 'register.html', args)

请注意,我使用render而不是过时的render_to_response简化了视图。这意味着您不需要手动处理csrf。

答案 1 :(得分:1)

您可以使用Django Generic Views,特别是CreateView,它会让您的生活更轻松。您可以像这样使用它:

from django.views.generic import CreateView

class CreateUserView(CreateView):
    template_name = 'register.html'
    form_class = UserCreationForm
    success_url = '/accounts/register_success'

将此添加到您的urls.py,您就可以了:

from mysite.views import CreateUserView

# add this url pattern
url(r'^sign_up/$', CreateUserView.as_view(), name='signup'),