婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 通用的Django注冊功能模塊實現(xiàn)方法

通用的Django注冊功能模塊實現(xiàn)方法

熱門標簽:滴滴地圖標注公司 如何申請400電話代理 甘肅高頻外呼系統(tǒng) 智能電話機器人調(diào)研 杭州房產(chǎn)地圖標注 天津塘沽區(qū)地圖標注 江門智能電話機器人 地圖標注可以遠程操作嗎 400電話在線如何申請

注冊功能實現(xiàn)

  • forms組件進行表單驗證;
  • 用戶頭像前端實時展示;
  • ajax發(fā)送post請求;

應(yīng)用forms組件實現(xiàn)用戶輸入信息的校驗。首先在app目錄下創(chuàng)建一個myform.py的文件。

如果你的項目至始至終只用到一個forms組件那么你可以直接建一個py文件書寫即可。

但是如果你的項目需要使用多個forms組件,那么你可以創(chuàng)建一個myforms文件夾在文件夾內(nèi),根據(jù)forms組件功能的不同創(chuàng)建不同的py文件。

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

......

# 書寫針對用戶表的forms主鍵代碼
from django import forms
from app01 import models

class MyRegForm(forms.Form):
  username = forms.CharField(label='用戶名',min_length=3,max_length=8,
                error_messages={
                  'required':'用戶名不能為空',
                  'min_length':'用戶名最少3位',
                  'max_length':'用戶名最大8位'
                },
                # 還需要讓標簽有Bootstrap樣式
                widget=forms.widgets.TextInput(attrs={'class':'form-control'})
                )
  password = forms.CharField(label='密碼',min_length=3,max_length=8,
                error_messages={
                  'required':'密碼不能為空',
                  'min_length':'密碼最少3位',
                  'max_length':'密碼最大8位'
                },
                # 還需要讓標簽有Bootstrap樣式
                widget=forms.widgets.PasswordInput(attrs={'class':'form-control'})
                )
  confirm_password = forms.CharField(label='確認密碼',min_length=3,max_length=8,
                    error_messages={
                    'required':'確認密碼不能為空',
                    'min_length':'確認密碼最少3位',
                    'max_length':'確認密碼最大8位'
                  },
                  # 還需要讓標簽有Bootstrap樣式
                  widget=forms.widgets.PasswordInput(attrs={'class':'form-control'})
                  )
  email = forms.EmailField(label='郵箱',
               error_messages={
                 'required': '郵箱不能為空',
                 'invalid':'郵箱格式不正確',
               },
               widget=forms.widgets.EmailInput(attrs={'class':'form-control'})
               )

  # 鉤子函數(shù)
  # 局部鉤子:校驗用戶名是否已存在
  def clean_username(self):
    username = self.cleaned_data.get('username')
    # 去數(shù)據(jù)庫中校驗
    is_exist = models.UserInfo.objects.filter(username=username)
    if is_exist:
      # 提示信息
      self.add_error('username','用戶名已存在')
    return username

  # 全局鉤子:校驗兩次密碼是否一致
  def clean(self):
    password = self.cleaned_data.get('password')
    confirm_password = self.cleaned_data.get('confirm_password')
    if not password == confirm_password:
      self.add_error('confirm_password','兩次密碼不一致')
    return self.cleaned_data

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

from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
  path('admin/', admin.site.urls),
  path('register/',views.register,name='reg'),
]

在視圖函數(shù)views.py中編寫forms組件檢驗、ajax發(fā)送的post請求獲取數(shù)據(jù)、調(diào)用django orm功能存儲數(shù)據(jù)、將后端的處理結(jié)果返回給前端進行校驗。

from app01.myforms import MyRegForm
from app01 import models
from django.http import JsonResponse
# Create your views here.

def register(request):
  form_obj = MyRegForm()
  if request.method == 'POST':
    # 定義返回給前端的js數(shù)據(jù)結(jié)果
    back_dic = {"code": 1000, 'msg': ''}
    # 校驗數(shù)據(jù)是否合法
    form_obj = MyRegForm(request.POST)
    # 判斷數(shù)據(jù)是否合法
    if form_obj.is_valid():
      # form_obj.cleaned_data:{'username': 'zhangsan', 'password': '123456', 'confirm_password': '123456', 'email': '123@qq.com'}
      # 將校驗通過的數(shù)據(jù)字典賦值給一個變量
      clean_data = form_obj.cleaned_data 
      # 將字典里面的confirm_password鍵值對刪除
      clean_data.pop('confirm_password') # {'username': 'zhangsan', 'password': '123456', 'email': '123@qq.com'}
      
      # 注意用戶頭像是一個圖片的文件,request.POST中只有鍵值對的數(shù)據(jù)
      file_obj = request.FILES.get('avatar')
      """
      	針對用戶頭像一定要判斷是否傳值,不能直接添加到字典里面去
      	否則file_obj=None,會將數(shù)據(jù)庫中默認的圖片路徑覆蓋。
      """
      if file_obj:
        # 向字典數(shù)據(jù)clean_data中增加一個圖片頭像的字段
        clean_data['avatar'] = file_obj
      # 操作數(shù)據(jù)庫保存數(shù)據(jù)
      models.UserInfo.objects.create_user(**clean_data)
      # 注冊成功則跳轉(zhuǎn)到登錄頁面
      back_dic['url'] = '/login/'
    else:
      back_dic['code'] = 2000 # 校驗存在錯誤
      back_dic['msg'] = form_obj.errors
    # 將字典類型的數(shù)據(jù)封裝成json返回到前端
    return JsonResponse(back_dic)
  return render(request,'register.html',locals())

前端的注冊頁面:register.html

!DOCTYPE html>
html lang="en">
head>
  meta charset="UTF-8">
  !-- Bootstrap -->
  link  rel="external nofollow" rel="stylesheet">
  script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js">
  script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js">/script>
  title>用戶注冊/title>
/head>
body>
div class="container-fluid">
  div class="row">
    div class="col-md-8 col-md-offset-2">
      h1 class="text-center">注冊/h1>
      form id="myform"> !--這里我們不用form表單提交數(shù)據(jù) 知識單純的用一下form標簽而已-->
        {% csrf_token %}
        {% for form in form_obj %}
          div class="form-group">
            label for="{{ form.auto_id }}">{{ form.label }}/label>
            {{ form }}
            span style="color: red" class="pull-right">/span>
          /div>
        {% endfor %}
        
        div class="form-group">
          label for="myfile">頭像
            {% load static %}
            img src="{% static 'img/default.jpg' %}" id='myimg' alt="" width="100" style="margin-left: 10px">
          /label>
          input type="file" id="myfile" name="avatar" style="display: none" >
        /div>

        input type="button" class="btn btn-primary pull-right" value="注冊" id="id_commit">
      /form>
    /div>
  /div>
/div>
/body>
/html>

【重難點】在于書寫JS處理邏輯:包括了圖片上傳加載、ajax發(fā)送的post請求以及后端注冊結(jié)果的信息處理。

script>
  $("#myfile").change(function () {
    // 文件閱讀器對象
    // 1 先生成一個文件閱讀器對象
    let myFileReaderObj = new FileReader();
    // 2 獲取用戶上傳的頭像文件
    let fileObj = $(this)[0].files[0];
    // 3 將文件對象交給閱讀器對象讀取
    myFileReaderObj.readAsDataURL(fileObj) // 異步操作 IO操作
    // 4 利用文件閱讀器將文件展示到前端頁面 修改src屬性
    // 等待文件閱讀器加載完畢之后再執(zhí)行
    myFileReaderObj.onload = function(){
       $('#myimg').attr('src',myFileReaderObj.result)
    }
  })

  $('#id_commit').click(function () {
    // 發(fā)送ajax請求   我們發(fā)送的數(shù)據(jù)中即包含普通的鍵值也包含文件
    let formDataObj = new FormData();
    // 1.添加普通的鍵值對
    {#console.log($('#myform').serializeArray()) // [{},{},{},{},{}] 只包含普通鍵值對#}
    $.each($('#myform').serializeArray(),function (index,obj) {
      {#console.log(index,obj)#} // obj = {}
      formDataObj.append(obj.name,obj.value)
    });
    // 2.添加文件數(shù)據(jù)
    formDataObj.append('avatar',$('#myfile')[0].files[0]);

    // 3.發(fā)送ajax請求
    $.ajax({
      url:"",
      type:'post',
      data:formDataObj,

      // 需要指定兩個關(guān)鍵性的參數(shù)
      contentType:false,
      processData:false,

      success:function (args) {
        if (args.code==1000){
          // 跳轉(zhuǎn)到登陸頁面
          //window.location.href = args.url
        }else{
          // 如何將對應(yīng)的錯誤提示展示到對應(yīng)的input框下面
          // forms組件渲染的標簽的id值都是 id_字段名
          $.each(args.msg,function (index,obj) {
            {#console.log(index,obj) // username    ["用戶名不能為空"]#}
            let targetId = '#id_' + index;
            $(targetId).next().text(obj[0]).parent().addClass('has-error')
          })
        }
      }
    })
  })
  // 給所有的input框綁定獲取焦點事件
  $('input').focus(function () {
    // 將input下面的span標簽和input外面的div標簽修改內(nèi)容及屬性
    $(this).next().text('').parent().removeClass('has-error')
  })
/script>

效果如下:

以上就是通用的Django注冊功能模塊實現(xiàn)步驟的詳細內(nèi)容,更多關(guān)于Django注冊功能模塊實現(xiàn)的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • django+vue實現(xiàn)注冊登錄的示例代碼
  • django注冊用郵箱發(fā)送驗證碼的實現(xiàn)
  • Django怎么在admin后臺注冊數(shù)據(jù)庫表
  • Django用戶登錄與注冊系統(tǒng)的實現(xiàn)示例
  • django 框架實現(xiàn)的用戶注冊、登錄、退出功能示例
  • django實現(xiàn)用戶注冊實例講解
  • Django實現(xiàn)auth模塊下的登錄注冊與注銷功能
  • Python Django 實現(xiàn)簡單注冊功能過程詳解
  • django的登錄注冊系統(tǒng)的示例代碼
  • django 通過ajax完成郵箱用戶注冊、激活賬號的方法
  • Django商城項目注冊功能的實現(xiàn)

標簽:廊坊 臨汾 漢中 東莞 河池 德宏 長春 重慶

巨人網(wǎng)絡(luò)通訊聲明:本文標題《通用的Django注冊功能模塊實現(xiàn)方法》,本文關(guān)鍵詞  通,用的,Django,注冊,功能模塊,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《通用的Django注冊功能模塊實現(xiàn)方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于通用的Django注冊功能模塊實現(xiàn)方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国内成人免费视频| 午夜免费久久看| 国产精品久久久久久户外露出| 日韩精品乱码av一区二区| 在线免费观看日本一区| 亚洲欧美视频在线观看视频| 色哟哟国产精品免费观看| 欧美国产一区在线| 99久久精品国产麻豆演员表| 亚洲国产精品二十页| av激情综合网| 亚洲激情在线激情| 在线观看成人免费视频| 亚洲一区在线观看网站| 欧美视频一区二区三区在线观看 | 国产精品无圣光一区二区| 国产**成人网毛片九色| 国产精品国产三级国产三级人妇 | 国产成人精品免费在线| 综合久久久久综合| 91久久精品一区二区三| 水蜜桃久久夜色精品一区的特点| 日韩视频一区二区在线观看| 国产精品一线二线三线| 亚洲免费在线观看视频| 欧美精品 国产精品| 国产精品一区二区视频| 亚洲老妇xxxxxx| 精品99一区二区三区| 色哟哟国产精品| 国产精品亚洲第一区在线暖暖韩国 | 欧美日精品一区视频| 狠狠色丁香久久婷婷综合丁香| 亚洲天堂免费看| 精品美女被调教视频大全网站| 成人黄色大片在线观看| 日本成人中文字幕| 亚洲免费观看高清完整版在线观看 | 国产91丝袜在线18| 青椒成人免费视频| 亚洲狠狠丁香婷婷综合久久久| 亚洲精品在线免费观看视频| 99精品欧美一区二区蜜桃免费| 五月激情丁香一区二区三区| 国产精品久久久99| 久久伊人蜜桃av一区二区| 欧美日韩久久久久久| 99久久久无码国产精品| 国产成人精品在线看| 午夜视频一区二区| 亚洲精品乱码久久久久久| 国产欧美久久久精品影院| 久久综合九色综合欧美98| 色悠悠亚洲一区二区| 福利一区在线观看| 美女视频网站久久| 午夜伊人狠狠久久| 亚欧色一区w666天堂| 中文字幕在线一区免费| www国产精品av| 精品国产一区二区三区四区四| 欧美日韩精品一区二区三区蜜桃 | 久久久久久久久久久久久久久99| 欧美性猛片aaaaaaa做受| 色狠狠av一区二区三区| www.欧美.com| av一区二区不卡| 成人黄色综合网站| 成人国产精品免费网站| 高清视频一区二区| 成人黄色电影在线| 色av成人天堂桃色av| 91啪在线观看| 欧美在线色视频| 欧美福利视频导航| 91麻豆精品国产自产在线观看一区| 在线观看91精品国产入口| 91国偷自产一区二区三区成为亚洲经典| 成人av电影在线观看| av电影天堂一区二区在线| 成人午夜电影小说| 色域天天综合网| 欧美日本视频在线| 精品奇米国产一区二区三区| 久久奇米777| 中文字幕亚洲精品在线观看| 一级日本不卡的影视| 天堂成人免费av电影一区| 精品一区二区三区在线观看国产 | 国产在线精品不卡| 99久久精品国产一区| 欧美人妇做爰xxxⅹ性高电影 | 成人免费视频在线观看| 一区二区三区加勒比av| 舔着乳尖日韩一区| 国产suv精品一区二区6| 在线观看91精品国产入口| 欧美大片一区二区三区| 国产精品国产三级国产aⅴ无密码| 亚洲一区二区三区爽爽爽爽爽 | 成人精品免费网站| 欧美三级电影网| 国产欧美综合色| 午夜精品福利久久久| 岛国av在线一区| 91超碰这里只有精品国产| 欧美国产欧美亚州国产日韩mv天天看完整| 一区二区三区四区乱视频| 国产一区高清在线| 欧美高清激情brazzers| 亚洲视频免费看| 国产精品一区二区久久精品爱涩| 色嗨嗨av一区二区三区| 中文久久乱码一区二区| 看片网站欧美日韩| 欧美日韩免费电影| 亚洲欧美一区二区在线观看| 九一久久久久久| 91麻豆精品国产91久久久久久| 国产农村妇女毛片精品久久麻豆 | 制服丝袜亚洲网站| 亚洲欧美日韩国产综合在线| 国产伦精品一区二区三区在线观看 | 丝袜亚洲另类欧美| 91网站最新地址| 久久久99久久| 秋霞av亚洲一区二区三| 欧美日韩一二区| 亚洲人一二三区| 99re成人精品视频| 国产欧美一区二区在线观看| 美腿丝袜亚洲综合| 91精品国产综合久久精品| 亚洲国产精品一区二区久久恐怖片| 国产91精品一区二区麻豆网站| 久久久蜜桃精品| 国产成a人亚洲精| 久久精品无码一区二区三区| 五月天精品一区二区三区| 欧美在线三级电影| 亚洲大片免费看| 欧美日韩日本视频| 免费在线观看日韩欧美| 日韩三级精品电影久久久| 精品一区二区免费视频| 久久免费美女视频| 成人精品在线视频观看| 亚洲日本在线天堂| 精品视频一区二区三区免费| 午夜激情综合网| 欧美群妇大交群的观看方式| 亚洲成人av在线电影| 欧美二区三区91| 久久精品国产99| 国产精品日日摸夜夜摸av| 91网站最新网址| 日韩高清在线一区| 26uuu成人网一区二区三区| 成人一区二区三区视频| 亚洲综合久久久久| 91精品久久久久久久99蜜桃| 另类调教123区| 国产精品久久久久aaaa樱花| 91福利在线观看| 国产中文一区二区三区| 亚洲欧美一区二区在线观看| 欧美性三三影院| 国产乱理伦片在线观看夜一区| 综合自拍亚洲综合图不卡区| 欧美日韩美女一区二区| 国产精品一区专区| 亚洲3atv精品一区二区三区| 久久欧美一区二区| 91亚洲精品一区二区乱码| 午夜精品视频在线观看| 久久亚洲综合av| 91国偷自产一区二区三区成为亚洲经典 | 高清视频一区二区| 亚洲国产精品久久久男人的天堂 | 国产精品色呦呦| 日韩欧美自拍偷拍| 91美女片黄在线观看91美女| 麻豆视频一区二区| 亚洲视频在线一区| 久久综合九色综合欧美就去吻| 日本道免费精品一区二区三区| 免费看日韩精品| 亚洲一区二区三区四区的| 久久精品人人做人人综合 | 欧美一区永久视频免费观看| 国产成人免费视频精品含羞草妖精 | 亚洲精品视频一区二区| 欧美一区二区成人6969| 色综合一区二区| 久久er精品视频| 日本韩国欧美一区二区三区| 国产精一品亚洲二区在线视频| 亚洲一区二区三区三| 中文字幕一区二区三区在线不卡| 精品999在线播放|