Django认证系统实现的web页面

在学习了Django认证系统后,对于利用Django实现web开发的流程有了初步了解。结合这一段时间的所学,做了个web页面。结合数据库、ajax、js、Djangoform表单和认证系统等

一:数据模块

扩展了Django中的user表,增加了自定义的字段

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class UserInfo(AbstractUser):
    phone = models.CharField(max_length=11)
    gender = models.CharField(max_length=2)

二:路由系统

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^register/',views.register),
    url(r'^login/',views.login_view),
    url(r'^home/',views.home),
    url(r'^logout/',views.logout_view),
    url(r'^modify_pwd/',views.modify_pwd),
    url(r'^$',views.home),
]

三:视图系统

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from django.contrib.auth import authenticate, login,logout
from app01 import forms
from app01.models import UserInfo

# Create your views here.
def register(request):
    form_obj = forms.Reg_form()
    if request.method == 'POST':
        form_obj = forms.Reg_form(request.POST)
        if form_obj.is_valid():
            info_dic = form_obj.cleaned_data
            sex_dic = {'1':'','2':'','3':'保密'}
            info_dic['gender']=sex_dic[info_dic['gender']]

            UserInfo.objects.create_user(
                username=info_dic['username'],
                password = info_dic['pwd'],
                gender=info_dic['gender'],
                phone =info_dic['phone']
            )
            return redirect('/login/')
    return render(request, "register.html",{'form_obj':form_obj})


def login_view(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')
        user = authenticate(username=username, password=pwd)
        if user:
            login(request, user)
            data = {'code':1}
        else:
            data = {'code': 0,'msg':'用户名或密码错误'}
        return JsonResponse(data)
    return render(request, 'login.html')


@login_required
def logout_view(request):
    logout(request)
    return redirect('/login/')


@login_required
def home(request):
    user_id = request.session['_auth_user_id']
    use_obj = request.user
    return render(request,'home.html',{'user':use_obj})

@login_required
def modify_pwd(request):
    if request.method == 'POST':
        old_pwd = request.POST.get('old_pwd')
        pwd = request.POST.get('pwd')
        re_pwd = request.POST.get('re_pwd')
        user_obj = request.user
        if user_obj.check_password(old_pwd):
            if re_pwd == pwd:
                user_obj.set_password(pwd)
                user_obj.save()
                data = {'code': 1}
            else:
                data = {'code': 0, 'msg': '两次输入密码不一致'}
        else:
            data = {'code': 0, 'msg': '原始密码输入错误'}
        return JsonResponse(data)
    return render(request,'modify_pwd.html')

四:form表单

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# Author:YiJun
from django import forms
from app01 import models
from django.forms import widgets
from django.core.exceptions import ValidationError  # 导入异常
import re

# Create your views here.
class Reg_form(forms.Form):
    # 用户名表单
    username = forms.CharField(
        min_length=4,
        label="设置用户名",
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "用户名最少4个字符"
        },
        widget=widgets.TextInput(
            attrs={
                'class': "form-control",
                'placeholder': '用户名'
            })
    )
    # 用户密码设置表单
    pwd = forms.CharField(
        min_length=6,
        label="设置密码",
        widget=forms.widgets.PasswordInput(
            attrs={
                'class': 'form-control',
                'placeholder': '密码'},
            render_value=True,
        ),
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "密码至少6位"

        }
    )
    # 用户密码确认表单
    r_pwd = forms.CharField(
        min_length=6,
        label="确认密码",
        widget=forms.widgets.PasswordInput(
            attrs={
                'class': 'form-control',
                'placeholder': '确认密码'},
            render_value=True,
        ),
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "密码至少6位"

        }
    )
    # 用户性别选择表单
    gender = forms.ChoiceField(
        choices=((1, ""), (2, ""), (3, "保密")),
        label="性别",
        initial=3,
        widget=forms.widgets.RadioSelect
    )
    # 用户手机号码表单
    phone = forms.CharField(
        label="手机号码",
        max_length=11,
        min_length=11,
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "手机号码至少11位",
            "max_length": "手机号码最多11位",
        },
        widget=widgets.TextInput(attrs={'class': "form-control",'placeholder': '手机号码'})
    )

    def clean_phone(self):
        value = self.cleaned_data['phone']
        expression = re.compile('^1[3589][0-9]{9}')
        if not expression.search(value).group():
            raise ValidationError('请输入正确的手机号码')
        else:
            return value
    def clean_username(self):
        value = self.cleaned_data['username']
        if models.UserInfo.objects.filter(username=value):
            raise ValidationError('用户名已经注册')
        else:
            return value


    def clean(self):
        pwd = self.cleaned_data.get("pwd")
        r_pwd = self.cleaned_data.get("r_pwd")
        if pwd != r_pwd:
            self.add_error("r_pwd", "两次输入的密码不一致!")
            # 两次输入的密码不一致
            raise ValidationError("两次输入的密码不一致!")
        else:
            self.cleaned_data.pop('r_pwd')
            return self.cleaned_data

五:模板系统

注册页面

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
    <title>Document</title>
</head>
<body>
<div class="container">
    <div class="row" style="margin-top: 50px">
        <div class="panel panel-primary">

            <div class="panel-heading"><h4>用户详细信息</h4></div>
            <div class="panel-body">

            </div>

            <!-- Table -->
            <div class="table-responsive">
                <table class="table table-bordered">
                    <thead>
                    <tr>
                        <th>#</th>
                        <th>用户名</th>
                        <th>手机号码</th>
                        <th>上次登陆时间</th>
                        <th>注册时间</th>
                        <th>用户性别</th>
                    </tr>
                    </thead>
                    <tbody>
                    <tr>
                        <th scope="row">1</th>
                        <td>{{ user.username }}</td>
                        <td>{{ user.phone }}</td>
                        <td>{{ user.last_login|date:'Y-m-d H:i:s' }}</td>
                        <td>{{ user.date_joined|date:'Y-m-d H:i:s' }}</td>
                        <td>{{ user.gender }}</td>
                    </tr>
                    </tbody>
                </table>
            </div>
        </div>
        <div style="margin-top: 20px">
            <a class="btn btn-info " href="/modify_pwd/">修改密码</a>
            <a class="btn btn-danger pull-right" href="/logout/">注销</a>
        </div>
    </div>
</div>
<script src="/static/jquery-3.3.1.min.js"></script>
<script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>

</body>
</html>
home.html

猜你喜欢

转载自www.cnblogs.com/li1992/p/9248152.html