jdango 项目试炼blog(3)--基于Form组件ajax用户注册

1、利用form组件建立form组件

from app01.models import UserInfo
from django import forms
from django.forms import widgets
from django.core.exceptions import  ValidationError
class UserFrom(forms.Form):   #固定格式
    user = forms.CharField(max_length=32,label=‘用户名‘,  # 设置前端lable标签
                           error_messages={‘required‘:‘该字段不能为空‘}, # 当用户未输入时报错信息
                           widget=widgets.TextInput(attrs={‘class‘:‘form-control‘}))  # 设置input的type 添加类标签
    pwd = forms.CharField(max_length=32,label=‘密码‘,
                          widget=widgets.PasswordInput(attrs={‘class‘: ‘form-control‘}))
    re_pwd = forms.CharField(max_length=32,label=‘确认密码‘,
                             widget=widgets.PasswordInput(attrs={‘class‘: ‘form-control‘}))
    email = forms.EmailField(max_length=32,label=‘电子邮箱‘,
                             error_messages={‘required‘: ‘格式错误‘},
                             widget=widgets.EmailInput(attrs={‘class‘: ‘form-control‘}))

    # 建立局部钩子
    def clean_user(self):
        user = self.cleaned_data.get(‘user‘)  # 已经过校验
        user_obj = UserInfo.objects.filter(username=user).first()
        if user_obj:
            #已被注册
            raise ValidationError(‘该用户已注册‘)
        else:
            return user

    # 建立全局钩子
    def clean(self):
        pwd = self.cleaned_data.get(‘pwd‘)
        re_pwd = self.cleaned_data.get(‘re_pwd‘)

        if pwd == re_pwd:
            return self.cleaned_data
        else:
            raise ValidationError(‘密码不一致‘)


2、views中注册验证

def register(request):
    form = UserFrom() # 生成form组件
    send_info = {‘user‘:None,‘msg‘:None}
    if request.method == ‘POST‘:
        form_obj = UserFrom(request.POST)
        if form_obj.is_valid():   # form表单进行格式校验
            send_info[‘user‘] = form_obj.cleaned_data.get(‘user‘)

            user = request.POST.get(‘user‘)
            pwd = request.POST.get(‘pwd‘)
            re_pwd = request.POST.get(‘re_pwd‘)
            email = request.POST.get(‘email‘)
            img = request.FILES.get(‘img‘)

            # 非明文存储
            UserInfo.objects.create_user(username=user,password=pwd,email=email,avatar=img)

        else:
            print(form_obj.cleaned_data) # 存放了所有正确信息
            print(form_obj.errors)  # 存放了所有错误信息
            send_info[‘msg‘] = form_obj.errors # 全局变量信息K为__all__
        return JsonResponse(send_info)

    return render(request,‘register.html‘,locals())


3、前端样式

<div class=‘container‘>
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
        <h1 class="text-center">用户注册</h1>
            <form >
                {% csrf_token %}
                {#form组件建立模型#}
                {% for filed in form %}
                <div class="form-group">
                    <label for="user">{{ filed.label }}</label>
                    {{ filed }}<span class="err_info pull-right"></span>
                </div>
                {% endfor %}
                <label for="img">头像
                    <div>
                        <img src="/static/img/timg.jpg" id="image">
                    </div>
                </label>
                <input id="img" type="file" style="display: none">

            <div>
                <input type="button" class="btn btn-info pull-right" value="提交" id="btn">
            </div>
            </form>
        </div>
    </div>
</div>


4、jquery

<script>
    $(function () {        //头象预览
        $(‘#img‘).change(function () {
            // 获取文件对象
            var file = $(‘#img‘)[0].files[0];
            // 获得文件对象的路径(文件阅读器)
            var reader = new FileReader();
            reader.readAsDataURL(file);//阅读文件的路径,并把结果保存在reader.result
            //更改文件路径(与reader.readAsDateURL是异步操作,需要用onload加载完再执行)
            reader.onload = function(){
            $(‘#image‘).attr(‘src‘,reader.result)}
        })

     //ajax输入验证
        $(‘#btn‘).click(function () {
            var formdata = new FormData
            formdata.append(‘user‘,$(‘#id_user‘).val());  //从form传来组件,默认id=id_组件名
            formdata.append(‘pwd‘,$(‘#id_pwd‘).val());
            formdata.append(‘re_pwd‘,$(‘#id_re_pwd‘).val());
            formdata.append(‘email‘,$(‘#id_email‘).val());
            formdata.append(‘img‘,$(‘#img‘)[0].files[0]);
            formdata.append(‘csrfmiddlewaretoken‘,$(‘[name =csrfmiddlewaretoken]‘).val());

            $.ajax({
                url:‘‘,
                type:‘POST‘,
                contentType:false,
                processData:false,
                data:formdata,
                success:function (data) {

                    if(data.user){
                        location.href= ‘/login/‘
                    }
                    else{
                        console.log(data[‘msg‘]);
                        {#清空错误信息#}
                        $(‘.err_info‘).text(‘‘);
                        $(‘.form-group‘).removeClass(‘has-error‘);
                        {#循环打印msg中的错误信息#}
                        $.each(data[‘msg‘],function (msg_k,msg_v) {
                            {#判断是不是全局钩子#}
                            if(msg_k==‘__all__‘){
                                $(‘#id_re_pwd‘).next().text(msg_v)
                                $(‘#id_pwd,#id_re_pwd‘).parent().addClass(‘has-error‘)
                            }
                            $(‘#id_‘+msg_k).next().text(msg_v);
                            $(‘#id_‘+msg_k).parent().addClass(‘has-error‘)  // 添加错误边框样式
                        })
                    }
                }
            })
        })
    })

</script>


重点:

1、form组件创建form组件,需要在views中生成对象obj,obj.is_vaild()进行判断

  局部钩子 clean_字段名称,用于验证字段验证,异常信息以{‘字段对象’:value}写入errors字典中;

  全局钩子 clean(self)用于判断密码是否一致,异常信息以{‘__all__‘ : [value,]}写入errors字典中;

  所有正确信息存放在 clean_data 中;错误信息存入 errors 中

2、前端头象预览,

  获得文件对象、获得文件路径(文件浏览器FileReader)、更换文件src(文件浏览器功能为异步操作,需利用onload)

3、from组件中errors信息,

  循环打印之前判断,errors中是否有全局钩子报错

  利用form组件在前端  id = id_组件字段名 进行拼接事件

  每次请求时,需要对之前报错数据进行清空

4、在数据库存储文件

  models中

  class UserInfo

  ....

  avatar = models.FileField(upload_to=‘avatars/‘,default=‘/avatars/default.png‘)

  实例化时,avatar = avatar_obj (avatar只接收文件对象)

  upload_to=‘avatars/‘ 文件会下载到项目的根目录中的avatars文件夹中(如果没有,自动生成)

原文地址:https://www.cnblogs.com/zhuzhiwei-2019/p/10739721.html

时间: 2024-08-30 09:31:59

jdango 项目试炼blog(3)--基于Form组件ajax用户注册的相关文章

Django 项目试炼blog(8) -- 评论树的显示

Views def get_tree_data(request): article_id = request.GET.get('article_id') send_data = list(Comment.objects.filter(article_id=article_id).values('pk','content','parent_comment_id')) return JsonResponse(send_data,safe=False) ORM生成的的是queryset对象,而非真正的

学生管理系统(用中间件)-------基于FORM组件

x学生管理系统(用中间件)-------基于FORM组件 目的:实现学生,老师,课程的增删改查 models.py from django.db import models # Create your models here. class UserInfo(models.Model): """ 用户表:既有班主任也有老师 """ username = models.CharField(max_length=32) password = model

基于Form组件实现的增删改和基于ModelForm实现的增删改

基于Form组件实现的增删改和基于ModelForm实现的增删改 一.ModelForm的介绍 ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 labels=None, # 提示信息 help_texts=None, # 帮助提示信息 widgets=None, # 自定义插件 error_messages=None, # 自定义错误信息(整体错误信息from django.cor

Django 项目试炼blog(10) --补充 滑动验证码

首先安装一个需要用到的模块 pip install social-auth-app-django 安装完后在终端输入pip list会看到 social-auth-app-django 3.1.0 social-auth-core 3.0.0 然后可以来我的github,下载关于滑动验证码的这个demo:https://github.com/Edward66/slide_auth_code 下载完后启动项目 python manage.py runserver 启动这个项目后,在主页就能看到示例

图书管理系统(无中间件,用装饰器的)-----未基于FORM组件

目的:实现图书的增删改查 1.urls.py 1 """周末作业aaa用图书管理系统django实现 URL Configuration 2 3 The `urlpatterns` list routes URLs to views. For more information please see: 4 https://docs.djangoproject.com/en/1.11/topics/http/urls/ 5 Examples: 6 Function views 7

django 项目试炼blog(1)

1.确定表结构 from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser): """ 用户信息表, 继承session生成的auth_user表 需要在setting中加入 AUTH_USER_MODEL = 'app01.UserInfo' """ nid = models.AutoField(primary_key=True) telepho

Django 项目试炼blog(9) -- 文本编辑器的使用(文件存储,预览)

HTML <div class="col-md-9"> <div> <p class="text-center" style="background-color: #e5eef7;font-size: 18px" >添加文章</p> <form action="" method="post" style="margin-top: 40px&qu

Django 项目试炼blog(6) -- 文章详情页1 -- 点赞功能

url #文章详情页 re_path(r'(?P<username>\w+)/article/(?P<article_id>\d+)/$',views.article), # 点赞 path('up_down/', views.up_down), views from django.db.models import F def up_down(request): sign = request.POST.get('sign') sign = json.loads(sign) # 前端

Django 项目试炼blog(7) -- 文章详情页2 -- 前端样式的继承与楼评论显示

views from django.db import transaction def comment(request): article_id = request.POST.get('article_id') content = request.POST.get('content') pid = request.POST.get('parent_id') #事务操作 生成评论,文章数据中评论总数自动+1(同时执行) with transaction.atomic(): comm_obj = C