结合数据库、ajax、js、Djangoform表单和认证系统的web页面
一:数据模块
扩展了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" rel="external nofollow" > <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/" rel="external nofollow" >修改密码</a> <a class="btn btn-danger pull-right" href="/logout/" rel="external nofollow" >注销</a> </div> </div> </div> <script src="/UploadFiles/2021-04-08/jquery-3.3.1.min.js">以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
2024年11月17日
2024年11月17日
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】