文章目录
1 注册表单类
- 用户注册和实现登录类似,首先需要填写表单。
编辑./account/forms.py,增加一个注册用户的表单类,并建立User的数据模型。
from django import forms
from django.contrib.auth.models import User #①
...
class RegistrationForm(forms.ModelForm): #②
password = forms.CharField(label="Password", widget=forms.PasswordInput)
password2 = forms.CharField(label="Confirm Password", widget=forms.PasswordInput)
class Meta:
model = User
fields = ("username", "email")
def clean_password2(self):
cd = self.cleaned_data
if cd["password"] != cd["password2"]:
raise forms.ValidationError("passwords do not match.")
return cd["password2"]
语句①引入了Django默认的用户类型User类。
语句②传递的参数为forms.ModelForm,而登录函数用的传参是forms.Form,两者的区别是:如果要将表单中的数据写入数据库或者修改某些记录的值,就要使用ModelForm;图个提交表单之后,不会对数据库进行修改,则使用Form。
- 编写注册的视图函数。
编辑./account/views/py文件,编写注册的视图函数。
from . forms import LoginForm, RegistrationForm
...
def register(request):
if request.method == "POST":
user_form = RegistrationForm(request.POST)
if user_form.is_valid():
new_user = user_form.save(commit = False)
new_user.set_password(user_form.cleaned_data["password"])
new_user.save()
return HttpResponse("successfully")
else:
return HttpResponse("Sorry, You can't register.")
else:
user_form = RegistrationForm()
return render(request, "account/register.html", {"form": user_form})
- 然后编写模板。
在./templates/account里面创建register.html文件,代码如下:
{% extends "base.html" %}
{% load staticfiles %}
{% block title %}register user{% endblock %}
{% block content %}
<div class="row text-center vertical-middle-sm">
<h1>Register</h1>
<p>If you are a user, <strong><a href="{% url 'account:user_login' %}">Login</a></strong>,please</p>
<p>or register.</p>
<form class="form-horizontal" action="." method="post">{% csrf_token %}
<div class="form-group">
<label for="{{ form.username.id_for_label }}" class="col-md-5 control-label">Username</label>
<div class="col-md-6 text-left">{{ form.username }}</div>
</div>
<div class="form-group">
<label for="{{ form.email.id_for_label }}" class="col-md-5 control-label">Email</label>
<div class="col-md-6 text-left">{{ form.email }}</div>
</div>
<div class="form-group">
<label for="{{ form.password.id_for_label }}" class="col-md-5 control-label">Password</label>
<div class="col-md-6 text-left">{{ form.password }}</div>
</div>
<div class="form-group">
<label for="{{ form.password.id_for_label }}" class="col-md-5 control-label">Confirm Password</label>
<div class="col-md-6 text-left">{{ form.password2 }}</div>
</div>
<input type="submit" class="btn btn-primary btn-lg" value="REGISTER">
</form>
</div>
{% endblock %}
- 最后配置url。
在./account/urls.py中配置。
url(r'^register/$', views.register, name='user_register'),
浏览器访问http://127.0.0.1:8000/account/register/即可查看注册页面。
2 增加注册内容
第一节中的额注册过程,填写用户名,邮箱,密码等,在默认的User数据模型中还有用户名字等,但要增加一个User数据模型中没有的字段,需要如下操作。
- 建立数据模型,以存储数据。
编辑./account/models.py文件
from django.db import models
from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.OneToOneField(User, unique=True)
birth = models.DateField(blank=True, null=True)
phone = models.CharField(max_length=20, null=True)
def __str__(self):
return 'user {}'.format(self.user.username)
依次执行:
develope/DjangoDemo/mysite
~ python manage.py makemigrations account
Migrations for 'account':
account/migrations/0001_initial.py
- Create model UserProfile
~ python manage.py migrate account
Operations to perform:
Apply all migrations: account
Running migrations:
Applying account.0001_initial... OK
执行完成后,本地生成新的数据库account_userprofile。
- 编辑表单类,用以网页提交数据。
编辑./account/forms.py
from django import forms
from django.contrib.auth.models import User
from .models import UserProfile
...
class UserProfileForm(forms.ModelForm):
class Meta:
model = UserProfile
fields = ("phone", "birth")
- 完善视图类,
编辑./account/view.py文件。
...
from . forms import LoginForm, RegistrationForm, UserProfileForm
...
def register(request):
if request.method == "POST":
user_form = RegistrationForm(request.POST)
userprofile_form = UserProfileForm(request.POST)
if user_form.is_valid()*userprofile_form.is_valid():
new_user = user_form.save(commit=False)
new_user.set_password(user_form.cleaned_data['password'])
new_user.save()
new_profile = userprofile_form.save(commit=False)
new_profile.user = new_user
new_profile.save()
return HttpResponse("successfully")
else:
return HttpResponse("Sorry, You can't register.")
else:
user_form = RegistrationForm()
userprofile_form = UserProfileForm()
return render(request, "account/register.html", {"form": user_form, "profile":userprofile_form})
- 完善模板
编辑 ./templates/account/register.html文件
{% extends "base.html" %}
{% block title %}register user{% endblock %}
{% block content %}
<div class="row text-center vertical-middle-sm">
<h1>Register</h1>
<p>If you are a user, <strong><a href="{% url 'account:user_login' %}">Login</a></strong>,please</p>
<p>or register.</p>
<form class="form-horizontal" action="." method="post">{% csrf_token %}
<div class="form-group">
<label for="{{ form.username.id_for_label }}" class="col-md-5 control-label">Username</label>
<div class="col-md-6 text-left">{{ form.username }}</div>
</div>
<div class="form-group">
<label for="{{ form.email.id_for_label }}" class="col-md-5 control-label">Email</label>
<div class="col-md-6 text-left">{{ form.email }}</div>
</div>
<div class="form-group">
<label for="{{ form.password.id_for_label }}" class="col-md-5 control-label">Password</label>
<div class="col-md-6 text-left">{{ form.password }}</div>
</div>
<div class="form-group">
<label for="{{ form.password.id_for_label }}" class="col-md-5 control-label">Confirm Password</label>
<div class="col-md-6 text-left">{{ form.password2 }}</div>
</div>
<div class="form-group">
<label for="{{ profile.birth.id_for_label }}" class="col-md-5 control-label">Birth Date</label>
<div class="col-md-6 text-left">{{ profile.birth }}</div>
</div>
<div class="form-group">
<label for="{{ profile.phone.id_for_label }}" class="col-md-5 control-label">Phone</label>
<div class="col-md-6 text-left">{{ profile.phone }}</div>
</div>
<input type="submit" class="btn btn-primary btn-lg" value="REGISTER">
</form>
</div>
{% endblock %}
打开注册界面
正常注册后:
数据入库:
3 管理新增的注册内容
在超级管理员界面进行集中管理注册信息。
- 编辑./account/admin.py文件进行编辑
from django.contrib import admin
from .models import UserProfile
class UserProfileAdmin(admin.ModelAdmin):
list_display = ('user', 'birth', 'phone')
list_filter = ('phone', )
admin.site.register(UserProfile, UserProfileAdmin)
list_display属性的作用是列出列表中的项目。
list_filter的作用是规定网页右边FILTER显示的内容。
访问http://127.0.0.1:8000/admin/进入管理后台