Django---Blog系统开发之注册页面

前端页面及渲染:

静态文件的配置:setting.py:

  static 文件放在app下

STATIC_URL = ‘/static/‘

STATIC_ROOT = (
    os.path.join(BASE_DIR,‘blog01/static‘)
)

media文件的配置:setting.py:

MEDIA_ROOT = (
    os.path.join(BASE_DIR,‘blog01/media‘)
)

MEDIA_URL = ‘/media/‘  #别名

static目录结构:

配置URL:

register html 页面

css 样式

//失入焦点时判断密码是否一致
$(‘#id_re_password‘).blur(function () {
    var pwd = $(‘#password‘).val();
    var re_pwd = $(this).val();
    if (pwd != re_pwd){
       var error_message = ‘密码不一致‘;
        $(‘.password_error_message‘).text(error_message)
    }
});

//得到焦点时清空错误提示信息
$(‘#id_re_password‘).focus(function () {
    $(‘.password_error_message‘).text(‘ ‘)
});

//ajax 发送注册数据
$(‘.register_button‘).click(function () {

    var formData = new FormData();

    var csrfmiddlewaretoken = $("[name=‘csrfmiddlewaretoken‘]").val();
    var username = $(‘#id_username‘).val();
    var password = $(‘#id_password‘).val();
    var re_password = $(‘#id_re_password‘).val();
    var email = $(‘#id_email‘).val();
    var valid_code = $(‘#id_valid_code‘).val();
    var avatar = $(‘#avatar‘)[0].files[0];

    formData.append("csrfmiddlewaretoken",csrfmiddlewaretoken);
    formData.append(‘username‘,username);
    formData.append(‘password‘,password);
    formData.append(‘re_password‘,re_password);
    formData.append(‘email‘,email);
    formData.append(‘valid_code‘, valid_code);
    formData.append(‘avatar‘,avatar);

    $.ajax({
            url:‘/register/‘,
            type:‘POST‘,
            data:formData,  //使用formadate,必须设置contentType,processDate为false
            contentType:false,
            processData:false,
            success:function (data) {
                data = JSON.parse(data);
                if (data[‘state‘]){
                    location.href = ‘/login/‘
                }
                else {

                    $(‘.user_error‘).text(data[‘error_message‘][‘username‘]);
                    $(‘.password_error‘).text(data[‘error_message‘][‘password‘]);
                    $(‘.email_error‘).text(data[‘error_message‘][‘email‘]);
                    $(‘.valid_code_error‘).text(data[‘error_message‘][‘valid_code‘]);
                    if (data[‘error_message‘][‘re_password‘]) {
                        $(‘.re_password_error‘).text(data[‘error_message‘][‘re_password‘]);
                    }
                    else {
                        $(‘.re_password_error‘).text(data[‘error_message‘][‘__all__‘]);
                    }
                }

            }
        })
});

//头像预览

$(‘.register_avatar_input‘).change(function () {
    var reader = new FileReader();
    var file = $(‘.register_avatar_input‘)[0].files[0];
    reader.readAsDataURL(file);
    reader.onload=function () {
        $(‘.register_avatar_img‘)[0].src = this.result;
        console.log($(‘.register_avatar_img‘)[0])
    }

});

//验证码刷新
$(‘.img_refresh‘).click(function () {
    $(‘.valid_img‘)[0].src += ‘?‘;

});

my action

from django.shortcuts import render,redirect,HttpResponse
from django.contrib import auth
from blog01.models import *
from blog01 import models
import random
from io import BytesIO
import json
from blog01 import forms

def valid_code(request):
    ‘‘‘create valid code picture‘‘‘
    f = BytesIO() #实例化BytesIo,创建一个内存存储文件的句柄
    img = Image.new(mode=‘RGB‘, #图片格式
                    size=(120,30), #图片大小
                    color=(random.randint(0,255),random.randint(0,255),random.randint(0,255))) #随机设置图片颜色
    draw = ImageDraw.Draw(img,mode="RGB")  #创建画笔句柄,讲imag 传入进去

    code_list=[] #存储验证码
    for i in range(5):
        char = random.choice([chr(random.randint(65,90)),str(random.randint(0,9))]) #随机生成字母和数字
        code_list.append(char) #添加到存储验证码到列表
        font = ImageFont.truetype(‘blog01/static/bootstrap/fonts/kumo.ttf‘,28)  #设置字体和大小
        draw.text([i*24,0],char,(random.randint(0,255),random.randint(0,255),random.randint(0,255)),font=font)

    #画干扰线
    for i in range(5):
        x1 = random.randint(0, 120)
        y1 = random.randint(0, 120)
        x2 = random.randint(0, 120)
        y2 = random.randint(0, 120)
        draw.line((x1, y1, x2, y2), fill=(random.randint(0, 255),random.randint(10, 255),random.randint(64, 255)))

    # 画干扰点
    for i in range(40):
        draw.point([random.randint(0, 120), random.randint(0, 30)], fill=(random.randint(0, 255),random.randint(10, 255),random.randint(64, 255)))

    # 画干扰圆
    for i in range(40):
        draw.point([random.randint(0,120), random.randint(0, 30)], fill=(random.randint(0, 255),random.randint(10, 255),random.randint(64, 255)))
        x = random.randint(0, 120)
        y = random.randint(0, 30)
        draw.arc((x, y, x + 4, y + 4), 0, 90, fill=(random.randint(0, 255),random.randint(10, 255),random.randint(64, 255)))

    img.save(f,‘png‘) #讲绘制好的图片保存到f内存里
    data = f.getvalue() #从f里获取存取的二进制文件

    validCode = ‘‘.join(code_list)  #拼接验证码

    request.session[‘validCode‘]=validCode #讲验证码存入session里

    return HttpResponse(data) #讲二进制文件返回给前端

def register(request):
    ‘‘‘render register html‘‘‘

    form_obj = forms.RegisterForm()
    if request.method == "POST":
        reponse_data = {}
        state = False
        error_message = ‘‘
        form_obj = forms.RegisterForm(request,request.POST)#

        if form_obj.is_valid(): #验证form 表单里的数据是否合格
            data = form_obj.cleaned_data  #clean_data取出jango form表单里的合格数据
            data.pop(‘re_password‘)  #删除非数据库里的字段
            data.pop(‘valid_code‘)
            file_obj = request.FILES.get("avatar")
            data[‘avatar‘] = file_obj
            UserInfo.objects.create_user(**data) #userinfo继承django user,并创建用户(创建用户存数据时会自动给用户密码加密)
            state=True

        else:
            errors = form_obj.errors
            error_message = errors
        reponse_data[‘error_message‘]=error_message
        reponse_data[‘state‘]=state
        return HttpResponse(json.dumps(reponse_data)) #pythons数据类型和js数据类型不一样,记得json序列化一下

    return render(request,‘register.html‘,{‘form_obj‘:form_obj})

views.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by Mona on 2017/9/6

from django import forms
from django.core.exceptions import ValidationError
from django.forms.utils import ErrorList
from blog01 import models

# ******************************register html*********************************************************
class RegisterForm(forms.Form):
    ‘‘‘create a Form class for register html‘‘‘

    def __init__(self, request=None,*args,**kwargs):
        super(RegisterForm,self).__init__(*args,**kwargs)
        self.request=request #要往session里加值,必须重写init方法,将request传入

    username = forms.CharField(min_length=5, #设置字段最小长度为5
                               max_length=12,
                               widget=forms.TextInput(attrs={‘class‘:‘form-control‘,‘placeholder‘:‘Username‘}),
                               error_messages=({‘required‘:‘不能为空‘})) #设置默认错误信息

    password = forms.CharField(widget=forms.PasswordInput(attrs={‘class‘:‘form-control‘,‘placeholder‘:‘Password‘}),
                               error_messages={‘required‘:‘不能为空‘})
    re_password = forms.CharField(widget=forms.PasswordInput(attrs={‘class‘:‘form-control‘,‘placeholder‘:‘Password‘}),
                                  error_messages={‘required‘: ‘不能为空‘})
    email = forms.EmailField(widget=forms.EmailInput(attrs={‘class‘:‘form-control‘,‘placeholder‘:‘Email‘}),
                             error_messages={‘required‘: ‘不能为空‘,‘invalid‘:‘格式错误‘})

    valid_code = forms.CharField(widget=forms.TextInput(attrs={‘class‘:‘form-control‘,‘placeholder‘:‘Valid Code‘}),
                                 error_messages={‘required‘: ‘不能为空‘, ‘invalid‘: ‘格式错误‘})

    def clean_password(self):
        ‘‘‘tail a hook for verification  设置局部的钩子对form表单定制验证方法,格式参照源码 ‘‘‘
        if len(self.cleaned_data[‘password‘])>=8:

            return self.cleaned_data[‘password‘]
        else:
            raise ValidationError(‘密码长度必须大于8位‘)

    def clean_re_password(self):
        ‘‘‘tail a function for verification  ‘‘‘
        if len(self.cleaned_data[‘re_password‘]) >= 8:
            return self.cleaned_data[‘re_password‘]
        else:
            raise ValidationError(‘密码长度必须大于8位‘)

    def clean_username(self):
        ‘‘‘tail a function for username verification‘‘‘
        if self.cleaned_data[‘username‘].isdigit() or self.cleaned_data[‘username‘].isalpha():
            raise ValidationError(‘用户名必须由数字和字母组成‘)
        else:
            if models.UserInfo.objects.filter(username=self.cleaned_data[‘username‘]):
                raise ValidationError(‘用户名已占用,请更改用户名‘)
            else:
                return self.cleaned_data[‘username‘]

    def clean_valid_code(self):
        ‘‘‘set global handler for valid code verification‘‘‘
        if self.cleaned_data.get(‘valid_code‘, ‘0‘).upper() == self.request.session[‘validCode‘].upper():
            return self.cleaned_data[‘valid_code‘]
        else:
            raise ValidationError(‘验证码错误‘)

    def clean(self):
        ‘‘‘set global hook for password verification. if first password equal repeat password,
        设置全局对钩子,对多个字段同时比较或验证‘‘‘
        if self.cleaned_data.get("password",0) == self.cleaned_data.get("re_password",1):
            return self.cleaned_data
        else:
            raise ValidationError("密码不一致")

# ****************************************************************************************************

form.py

时间: 2024-08-06 07:54:21

Django---Blog系统开发之注册页面的相关文章

[课程设计]Scrum 3.2 多鱼点餐系统开发进度(页面优化&下单详细信息页面)

Scrum 3.2 多鱼点餐系统开发进度(页面优化&下单详细信息页面)  1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店点餐系统WEB 5.Sprint 3时间:12.09-12.18 重案组成员   姓名 学号 博客链接 Github链接 队长 黄冠锋 201406114134 http://www.cnblogs.com/hgf520/ https://github.com/crown999   卢利钦 20

Scrum 3.2 多鱼点餐系统开发进度(页面优化&下单详细信息页面)

Scrum 3.2 多鱼点餐系统开发进度(页面优化&下单详细信息页面)  1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店点餐系统WEB 5.Sprint 3时间:12.09-12.18 重案组成员   姓名 学号 博客链接 Github链接 队长 黄冠锋 201406114134 http://www.cnblogs.com/hgf520/ https://github.com/crown999   卢利钦 20

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 UserIn

.Net程序员玩转Android开发---(4)注册页面布局

上一篇我们介绍了登陆页面的布局,这一节我们看看注册页面的布局,实际上页面布局大同小异,来一起熟悉下基本控件的用法. 效果图: 1.添加注册页面 右键选中layout文件夹,添加注册页面.如下图 点击完成,页面添加完毕. 在页面中添加控件,XML代码如下 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com

前端开发---登陆注册页面优化

1.本次用到错误提示文字的颜色 http://v3.bootcss.com/css/#forms jquery 教程: http://www.w3school.com.cn/jquery/index.asp 2.工程地址:https://github.com/digitalClass/web_page 网站发布地址: http://115.28.30.25:8029/ 3. 主要工作 优化登陆注册页面显示 因为业务需要, 登陆注册页面被后端给改了, 显示效果如下: 可以看到表单全部乱掉了.打开后

(2) 搭建 Android 系统开发环境

说干就干,先按 Google 官方的指导,搭建 Android 系统开发环境.页面(需FQ):http://source.android.com/source/initializing.html 安装 ubuntu-14.04 64bit 安装系统有两种方式可选,直接装在物理机上或装在虚拟机中,区别主要就是性能了,本次是安装在虚拟机中的.之前都是装在物理机上的,但是只有一台电脑,而做开发的时候往往还要做些笔记或者其它的事情.总之,在 ubuntu 中完成这些工作并不容易,以前折腾过,也怕了.另外

python Django注册页面显示头像

python Django注册页面显示头像(views) def register(request): ''' 注册 :param request: :return: ''' if request.method=='GET': obj = Register(request) return render(request, 'register.html', {'obj': obj}) else: obj = Register(request,request.POST,request.FILES) i

Django注册页面配置设计

一.上次回顾 Django数据的增查改删 models 中有userInfo 三个字段 user password phonenumber,models.userInfo.objects.all().values('user')#只取user列models.userInfo.objects.all().values_list('id','user')#取ID 和user两列合并生成一个列表models.userInfo.objects.get(id=1)增加数据 models.userInfo.

【Mac系统 + Python + Django】之开发一个发布会系统【Django视图(一)】

这里我们要进行开发一个发布会系统来了解Django框架,来看第一部分. 目录: 一.登录功能 二.Cookie和Session 三.Django认证系统 一.登录功能 返回目录 在上一章,我们已经简单用了html模板,在它基础上继续开发: 1.修改index.html文件为发布会html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> &l