Django创建新用户失败

时间:2018-04-27 12:12:36

标签: python html css django

我在尝试使用Django中的UserCreationForm创建新用户时遇到了一些困难。 我认为问题出现在注册HTML页面上,但我无法理解我做错了什么。 填写必填字段后单击提交时没有任何反应。 我希望你能帮助我。

signup.html 的一部分:

<div class="container">
                                <form id="register-form" method="post">
                                    {% csrf_token %}
                                    {% for field in form %}

                                        {% if field.name == 'first_name' %}
                                          <div class="form-group">
                                            <input id="register-first_name" type="text" name="registerFirst" required
                                                   class="input-material">
                                            <label for="register-first_name" class="label-material">{{ field.label_tag }}</label>
                                          </div>
                                        {% endif %}


                                        {% if field.name == 'last_name' %}
                                          <div class="form-group">
                                            <input id="register-last_name" type="text" name="registerLast" required
                                                   class="input-material">
                                            <label for="register-last_name" class="label-material">{{ field.label_tag }}</label>
                                          </div>
                                        {% endif %}


                                        {% if field.name == 'username' %}
                                          <div class="form-group">
                                            <input id="username" type="text" name="username" required
                                                   class="input-material">
                                            <label for="username" class="label-material">{{ field.label_tag }}</label>
                                          </div>
                                        {% endif %}



                                        {% if field.name == 'email' %}
                                          <div class="form-group">
                                            <input id="register-email" type="text" name="registerEmail" required
                                                   class="input-material">
                                            <label for="register-email" class="label-material">{{ field.label_tag }}</label>
                                          </div>
                                        {% endif %}



                                        {% if field.name == 'password' %}
                                          <div class="form-group">
                                            <input id={{ form.name.name }} type="text" name="password" required
                                                   class="input-material">
                                            <label for={{ form.name.name }} class="label-material">{{ field.label_tag }}</label>
                                          </div>
                                        {% endif %}

                                    {% endfor %}

                                    <input id="register" type="submit" value="Register" class="btn btn-primary">
                                </form>
                            <div/>

我的 forms.py

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User


class SignUpForm(UserCreationForm):
    first_name = forms.CharField(max_length=30, required=False, help_text='Optional.')
    last_name = forms.CharField(max_length=30, required=False, help_text='Optional.')
    email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.')

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email', 'password', )

    def save(self, commit=True):
        user = super(SignUpForm, self).save(commit=False)
        user.email = self.cleaned_data['email']
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.save()

我的 views.py

from django.http import HttpResponse
from django.shortcuts import render
from django.contrib.auth import authenticate
from django.contrib.auth import login as login_a
from django.shortcuts import render, redirect

from movie.forms import SignUpForm


def index(request):
    return render(request, 'home.html')

def login(request):
    return render(request,'login.html')

def logout(request):
    return render(request,'logout.html')

def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password')
            print (username);
            print (raw_password);
            user = authenticate(username=username, password=raw_password)
            login_a(request, user)
            return redirect('login')
    else:
        form = SignUpForm()
    return render(request, 'signup.html', {'form': form})

1 个答案:

答案 0 :(得分:3)

您的表单看起来不正确。您使用的名称值不正确(例如name="registerFirst"而不是name="first_name"),因此Django表单不会使用提交的值。那么您没有显示字段错误,因此您在提交表单时无法获得任何有用的反馈。

我首先让Django渲染表单。这将让您解决视图中的任何问题。

<form id="register-form" method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input id="register" type="submit" value="Register" class="btn btn-primary">
</form>

为了帮助调试,您可以在视图中打印值,例如在print(form.errors)阻止后添加if form.is_valid():

然后,一旦视图使用简单模板,如果需要对布局进行更多控制,则可以手动渲染字段。有关详细信息,请参阅rendering fields manually上的文档。如果这样做,请记住向用户显示任何字段/表单错误。

如果您确实手动渲染字段,则可以使用{{ form.first_name }}访问字段,而不是循环浏览{% for field in form %},然后必须检查field.name