我在尝试使用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})
答案 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
。