脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - 通用的Django注册功能模块实现方法

通用的Django注册功能模块实现方法

2021-09-02 00:28TrainingL Python

这篇文章主要介绍了通用的Django注册功能模块实现步骤,帮助大家更好的理解和使用django,感兴趣的朋友可以了解下

注册功能实现

  • forms组件进行表单验证;
  • 用户头像前端实时展示;
  • ajax发送post请求;

应用forms组件实现用户输入信息的校验。首先在app目录下创建一个myform.py的文件。

如果你的项目至始至终只用到一个forms组件那么你可以直接建一个py文件书写即可。

但是如果你的项目需要使用多个forms组件,那么你可以创建一个myforms文件夹在文件夹内,根据forms组件功能的不同创建不同的py文件。

  • regform.py
  • loginform.py
  • userform.py
  • orderform.py

......

  1. # 书写针对用户表的forms主键代码
  2. from django import forms
  3. from app01 import models
  4.  
  5. class MyRegForm(forms.Form):
  6. username = forms.CharField(label='用户名',min_length=3,max_length=8,
  7. error_messages={
  8. 'required':'用户名不能为空',
  9. 'min_length':'用户名最少3位',
  10. 'max_length':'用户名最大8位'
  11. },
  12. # 还需要让标签有Bootstrap样式
  13. widget=forms.widgets.TextInput(attrs={'class':'form-control'})
  14. )
  15. password = forms.CharField(label='密码',min_length=3,max_length=8,
  16. error_messages={
  17. 'required':'密码不能为空',
  18. 'min_length':'密码最少3位',
  19. 'max_length':'密码最大8位'
  20. },
  21. # 还需要让标签有Bootstrap样式
  22. widget=forms.widgets.PasswordInput(attrs={'class':'form-control'})
  23. )
  24. confirm_password = forms.CharField(label='确认密码',min_length=3,max_length=8,
  25. error_messages={
  26. 'required':'确认密码不能为空',
  27. 'min_length':'确认密码最少3位',
  28. 'max_length':'确认密码最大8位'
  29. },
  30. # 还需要让标签有Bootstrap样式
  31. widget=forms.widgets.PasswordInput(attrs={'class':'form-control'})
  32. )
  33. email = forms.EmailField(label='邮箱',
  34. error_messages={
  35. 'required': '邮箱不能为空',
  36. 'invalid':'邮箱格式不正确',
  37. },
  38. widget=forms.widgets.EmailInput(attrs={'class':'form-control'})
  39. )
  40.  
  41. # 钩子函数
  42. # 局部钩子:校验用户名是否已存在
  43. def clean_username(self):
  44. username = self.cleaned_data.get('username')
  45. # 去数据库中校验
  46. is_exist = models.UserInfo.objects.filter(username=username)
  47. if is_exist:
  48. # 提示信息
  49. self.add_error('username','用户名已存在')
  50. return username
  51.  
  52. # 全局钩子:校验两次密码是否一致
  53. def clean(self):
  54. password = self.cleaned_data.get('password')
  55. confirm_password = self.cleaned_data.get('confirm_password')
  56. if not password == confirm_password:
  57. self.add_error('confirm_password','两次密码不一致')
  58. return self.cleaned_data

然后在urls.py中配置注册页的路由信息。

  1. from django.contrib import admin
  2. from django.urls import path
  3. from app01 import views
  4.  
  5. urlpatterns = [
  6. path('admin/', admin.site.urls),
  7. path('register/',views.register,name='reg'),
  8. ]

在视图函数views.py中编写forms组件检验、ajax发送的post请求获取数据、调用django orm功能存储数据、将后端的处理结果返回给前端进行校验。

  1. from app01.myforms import MyRegForm
  2. from app01 import models
  3. from django.http import JsonResponse
  4. # Create your views here.
  5.  
  6. def register(request):
  7. form_obj = MyRegForm()
  8. if request.method == 'POST':
  9. # 定义返回给前端的js数据结果
  10. back_dic = {"code": 1000, 'msg': ''}
  11. # 校验数据是否合法
  12. form_obj = MyRegForm(request.POST)
  13. # 判断数据是否合法
  14. if form_obj.is_valid():
  15. # form_obj.cleaned_data:{'username': 'zhangsan', 'password': '123456', 'confirm_password': '123456', 'email': '123@qq.com'}
  16. # 将校验通过的数据字典赋值给一个变量
  17. clean_data = form_obj.cleaned_data
  18. # 将字典里面的confirm_password键值对删除
  19. clean_data.pop('confirm_password') # {'username': 'zhangsan', 'password': '123456', 'email': '123@qq.com'}
  20.  
  21. # 注意用户头像是一个图片的文件,request.POST中只有键值对的数据
  22. file_obj = request.FILES.get('avatar')
  23. """
  24. 针对用户头像一定要判断是否传值,不能直接添加到字典里面去
  25. 否则file_obj=None,会将数据库中默认的图片路径覆盖。
  26. """
  27. if file_obj:
  28. # 向字典数据clean_data中增加一个图片头像的字段
  29. clean_data['avatar'] = file_obj
  30. # 操作数据库保存数据
  31. models.UserInfo.objects.create_user(**clean_data)
  32. # 注册成功则跳转到登录页面
  33. back_dic['url'] = '/login/'
  34. else:
  35. back_dic['code'] = 2000 # 校验存在错误
  36. back_dic['msg'] = form_obj.errors
  37. # 将字典类型的数据封装成json返回到前端
  38. return JsonResponse(back_dic)
  39. return render(request,'register.html',locals())

前端的注册页面:register.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <!-- Bootstrap -->
  6. <link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="external nofollow" rel="stylesheet">
  7. <script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js">
  8. <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
  9. <title>用户注册</title>
  10. </head>
  11. <body>
  12. <div class="container-fluid">
  13. <div class="row">
  14. <div class="col-md-8 col-md-offset-2">
  15. <h1 class="text-center">注册</h1>
  16. <form id="myform"> <!--这里我们不用form表单提交数据 知识单纯的用一下form标签而已-->
  17. {% csrf_token %}
  18. {% for form in form_obj %}
  19. <div class="form-group">
  20. <label for="{{ form.auto_id }}">{{ form.label }}</label>
  21. {{ form }}
  22. <span style="color: red" class="pull-right"></span>
  23. </div>
  24. {% endfor %}
  25.  
  26. <div class="form-group">
  27. <label for="myfile">头像
  28. {% load static %}
  29. <img src="{% static 'img/default.jpg' %}" id='myimg' alt="" width="100" style="margin-left: 10px">
  30. </label>
  31. <input type="file" id="myfile" name="avatar" style="display: none" >
  32. </div>
  33.  
  34. <input type="button" class="btn btn-primary pull-right" value="注册" id="id_commit">
  35. </form>
  36. </div>
  37. </div>
  38. </div>
  39. </body>
  40. </html>

【重难点】在于书写JS处理逻辑:包括了图片上传加载、ajax发送的post请求以及后端注册结果的信息处理。

  1. <script>
  2. $("#myfile").change(function () {
  3. // 文件阅读器对象
  4. // 1 先生成一个文件阅读器对象
  5. let myFileReaderObj = new FileReader();
  6. // 2 获取用户上传的头像文件
  7. let fileObj = $(this)[0].files[0];
  8. // 3 将文件对象交给阅读器对象读取
  9. myFileReaderObj.readAsDataURL(fileObj) // 异步操作 IO操作
  10. // 4 利用文件阅读器将文件展示到前端页面 修改src属性
  11. // 等待文件阅读器加载完毕之后再执行
  12. myFileReaderObj.onload = function(){
  13. $('#myimg').attr('src',myFileReaderObj.result)
  14. }
  15. })
  16.  
  17. $('#id_commit').click(function () {
  18. // 发送ajax请求 我们发送的数据中即包含普通的键值也包含文件
  19. let formDataObj = new FormData();
  20. // 1.添加普通的键值对
  21. {#console.log($('#myform').serializeArray()) // [{},{},{},{},{}] 只包含普通键值对#}
  22. $.each($('#myform').serializeArray(),function (index,obj) {
  23. {#console.log(index,obj)#} // obj = {}
  24. formDataObj.append(obj.name,obj.value)
  25. });
  26. // 2.添加文件数据
  27. formDataObj.append('avatar',$('#myfile')[0].files[0]);
  28.  
  29. // 3.发送ajax请求
  30. $.ajax({
  31. url:"",
  32. type:'post',
  33. data:formDataObj,
  34.  
  35. // 需要指定两个关键性的参数
  36. contentType:false,
  37. processData:false,
  38.  
  39. success:function (args) {
  40. if (args.code==1000){
  41. // 跳转到登陆页面
  42. //window.location.href = args.url
  43. }else{
  44. // 如何将对应的错误提示展示到对应的input框下面
  45. // forms组件渲染的标签的id值都是 id_字段名
  46. $.each(args.msg,function (index,obj) {
  47. {#console.log(index,obj) // username ["用户名不能为空"]#}
  48. let targetId = '#id_' + index;
  49. $(targetId).next().text(obj[0]).parent().addClass('has-error')
  50. })
  51. }
  52. }
  53. })
  54. })
  55. // 给所有的input框绑定获取焦点事件
  56. $('input').focus(function () {
  57. // 将input下面的span标签和input外面的div标签修改内容及属性
  58. $(this).next().text('').parent().removeClass('has-error')
  59. })
  60. </script>

效果如下:

通用的Django注册功能模块实现方法

以上就是通用的Django注册功能模块实现步骤的详细内容,更多关于Django注册功能模块实现的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/traininglxl/p/14370224.html

延伸 · 阅读

精彩推荐