django编写登录注册

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

来判断这个请求的用户是否登录

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值