User模型
User模型是django自带的一个用来表示用户信息的一个模型,这个模型是很重的,用来存储用户信息,django为这个模型提供了很多的方法用来验证用户信息,我们也可以使用一些方法扩展User模型来符合自己的需求。
User模型自带的字段:
mysql> describe auth_user;
+--------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| password | varchar(128) | NO | | NULL | |
| last_login | datetime(6) | YES | | NULL | |
| is_superuser | tinyint(1) | NO | | NULL | |
| username | varchar(150) | NO | UNI | NULL | |
| first_name | varchar(30) | NO | | NULL | |
| last_name | varchar(150) | NO | | NULL | |
| email | varchar(254) | NO | | NULL | |
| is_staff | tinyint(1) | NO | | NULL | |
| is_active | tinyint(1) | NO | | NULL | |
| date_joined | datetime(6) | NO | | NULL | |
+--------------+--------------+------+-----+---------+----------------+
11 rows in set (0.00 sec)
可以直接创建超级用户 python manage.py createsuperuser命令,便会在这个表中创建一行
下面我们做一个用户登录和注册的页面和用户信息展示的页面来体验一下
author/forms.py
from django import forms
from django.contrib.auth.models import User
class UserForm(forms.Form):
username=forms.CharField()
password=forms.CharField()
author/urls.py
from django.urls import path
from . import views
urlpatterns=[
path('login',views.user_login,name='login'),
path('userprifle',views.userprifle,name='userprifle'),
path('register',views.register,name='register'),
]
author/views.py
from django.shortcuts import render,redirect
from django.http import HttpResponse
# Create your views here.
from django.contrib.auth import authenticate,login
from .forms import UserForm
from django.contrib.auth.models import User
def user_login(request):
if request.method=="GET":
form=UserForm()
context={
'form':form,
}
return render(request,'auth/login.html',context)
else:
user_post=UserForm(data=request.POST)
if user_post.is_valid():
data=user_post.cleaned_data
print(data['username'],data['password'])
user=authenticate(username=data['username'],password=data['password'])
print(user)
if user:
login(request,user)
return redirect("auth:userprifle")
else:
return HttpResponse("密码错误")
else:
return HttpResponse("格式错误")
def register(request):
if request.method=="GET":
form=UserForm()
context={
'form':form,
}
return render(request,'auth/register.html',context)
else:
user_post=UserForm(data=request.POST)
if user_post.is_valid():
data=user_post.cleaned_data
User.objects.create_user(username=data['username'],password=data['password'])
return redirect("auth:login")
else:
return HttpResponse("格式错误")
def userprifle(request):
user=request.user
if request.user.is_authenticated:
context={
'user':user,
}
return render(request,'auth/userprifile.html',context)
return redirect("auth:login")
templates/auth/login.html
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div>
<form method="post" action="{% url 'auth:login' %}" role="form" style="height:300px;width:600px;">
{% csrf_token %}
<div class="form-group">
<label>用户</label>
<input class="form-control" type="text" placeholder="输入账户" name="username">
</div>
<div class="form-group">
<label>密码</label>
<input class="form-control" type="password" placeholder="输入密码" name="password">
</div>
<div class="form-group">
<input type="submit" class="form-control btn btn-primary" value="登录">
</div>
</form>
</div>
</div>
</body>
</html>
templates/auth/register.html
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div>
<form method="post" action="{% url 'auth:register' %}" role="form" style="height:300px;width:600px;">
{% csrf_token %}
<div class="form-group">
<label>用户</label>
<input class="form-control" type="text" placeholder="输入账户" name="username">
</div>
<div class="form-group">
<label>密码</label>
<input class="form-control" type="password" placeholder="输入密码" name="password">
</div>
<div class="form-group">
<input type="submit" class="form-control btn btn-primary" value="注册">
</div>
</form>
</div>
</div>
</body>
</html>
templates/auth/userprifile.html
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h1 style="text-align:center;">个人信息</h1>
<br><br><br>
<table class="table table-bordered" >
<thead>
<tr>
<td>用户</td>
<td>密码</td>
<td>邮箱</td>
<td>名</td>
<td>姓</td>
<td>注册日期</td>
<td>最新登录</td>
</tr>
</thead>
<tbody>
<tr>
<td>{{user.username}}</td>
<td>{{user.password}}</td>
<td>{{user.email}}</td>
<td>{{user.first_name}}</td>
<td>{{user.last_name}}</td>
<td>{{user.date_joined}}</td>
<td>{{user.last_login}}</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
下面看一下我们的结果
login
register
个人信息
主要涉及到的内容有:
user_post=UserForm(data=request.POST)
if user_post.is_valid():
data=user_post.cleaned_data
使用定义的表单类来验证用户的输入是否合法,然后清洗数据,data是一个用户传递post参数的字典。
authenticate(username=data['username'],password=data['password'])
这个函数是用来验证用户的登录是否成功的,如果表中有这个用户名密码则返回这个用户模型对象,否则返回None,可以判断是否为None来判断用户输入用户名和密码是否正确。
login(request,user)
使用上面的函数可以登录用户,会生成一个sessionid在cookie中,在djang_session表中生成用户的信息,第一个参数是请求对象,第二个参数是一个用户模型对象
User.objects.create_user(username=data['username'],password=data['password'])
使用上面的代码可以创建一个用户,在auth_uesr中会添加一天用户信息。
user=request.user
表示可以得到一个登录的模型对象。
request.user.is_authenticated
来判断这个请求的用户是否登录