版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/85220484
一 系统默认可注册的字段
二 添加额外的注册字段
1 新增模型
from django.db import models
from django.contrib.auth.models import User
# 所定义的模型类对应数据库中建立名为account_userProfile数据表
class UserProfile(models.Model):
# 声明UserProfile类与User类之间的关系是“一对一”的
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)
2 执行如下两条命令进行数据迁移
(venv) E:\Django\mysite\mysite>python manage.py makemigrations
(venv) E:\Django\mysite\mysite>python manage.py migrate
3 数据迁移后,数据库产生的结果如下:
三 编辑表单类mysite/account/forms.py
from django import forms
# 引入Django默认的用户模型User类,在这个表的类中就应用User模型,不需要
# 再新建用户数据模型了
from django.contrib.auth.models import User
from .models import UserProfile
#####
## ......
#####
class UserProfileForm(forms.ModelForm):
class Meta:
model = UserProfile
fields = ("phone", "birth")
四 编辑视图类mysite/account/views.py
from django.shortcuts import render
from django.http import HttpResponse
# Django默认的用户认证和管理中的两个方法
from django.contrib.auth import authenticate, login
from .forms import LoginForm,RegistrationForm,UserProfileForm
# 用户登录视图函数
def user_login(request):
# POST请求处理,里面绑定了数据
if request.method == "POST":
# 通过request.POST得到提交的表单数据,也是一个字典对象
login_form = LoginForm(request.POST)
# 验证传入的数据是否合法
if login_form.is_valid():
# 以健值对的形式记录了用户名和密码
cd = login_form.cleaned_data
# 验证用户名和密码
user = authenticate(username=cd['username'], password=cd['password'])
# 用户名和密码正确得到一个实例对象
if user:
# 用户登录操作,用户登录之后,Django会自动调用默认的session应用,将用户ID保存在session中,
# 完成用户登录操作
login(request,user)
# 当网页返回字符串,用HttpResponse方法
return HttpResponse("欢迎你,你已授权登录!")
# 用户名和密码不对,得到空实例
else:
return HttpResponse("对不起,用户名和密码错误!")
else:
return HttpResponse("Invalid login")
# GET请求处理,里面没有绑定数据
if request.method == "GET":
login_form = LoginForm()
return render(request, "account/login.html", {"form":login_form})
# 增强版注册
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("注册成功!")
else:
return HttpResponse("对不起,你不能注册.")
else:
user_form = RegistrationForm()
userprofile_form = UserProfileForm()
return render(request, "account/register.html", {"form": user_form, "profile":userprofile_form})
五 编辑模板mysite/templates/account/register.html
{% extends "base.html" %}
{% block title %}register user{% endblock %}
{% block content %}
<div class="row text-center vertical-middle-sm">
<h1>注册</h1>
<p>如果你是注册用户<strong><a href="{% url 'account:user_login' %}">登录</a></strong></p>
<p>注册</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">用户名</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">邮箱</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">密码</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">确认密码</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">生日</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">电话</label>
<div class="col-md-6 text-left">{{ profile.phone }}</div>
</div>
<input type="submit" class="btn btn-primary btn-lg" value="注册">
</form>
</div>
{% endblock %}
六 运行结果