基於Ajax和forms組件實現註冊功能

来源:https://www.cnblogs.com/huyangblog/archive/2018/02/27/8479766.html
-Advertisement-
Play Games

前端HTML <!DOCTYPE html> {% load static %} {% get_static_prefix as getstatic %} <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua ...


前端HTML

<!DOCTYPE html>
{% load static %}
{% get_static_prefix as getstatic %}

<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="icon" href="https://www.jd.com/favicon.ico">
    <link href="{{ getstatic }}plugins/bootstrap-3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <title>註冊頁面</title>
    <style>
        .title-top {
            padding: 0;
            font-size: 21px;
            margin-top: 40px;
        }

        .form-padding {
            padding-right: 65px;
        }

        .has-feedback .country-code {
            width: 53px;
            text-align: right;
            padding-right: 5px;
        }

        .mobile-control-wrap {
            display: flex;
        }

        .mobile-num {
            margin-left: 10px;
        }

        .form-horizontal .form-group {
            margin-right: -15px;
            margin-left: -15px;
        }

        .body-box {
            margin-top: 70px;
            height: 567px;
            width: 68%;
        }

        .cnblogs-btn-blue {
            color: white;
            padding: 6px 14px;
            letter-spacing: 1em;
            padding-left: 2em;
            background-color: RGB(70, 136, 214);
            text-align: center;

        }

        .cnblogs-btn-blue :hover {
            color: white;
        }

        .navbar {
            background-color: RGB(40, 62, 92);
        }

        .side-img-box {
            height: 300px;
            position: relative;
            padding-left: 0;
            margin-top: 168px;
        }

        .side-img-box img {
            position: relative;
            width: 100%;
            top: 50%;
            transform: translateY(-50%);
            border-radius: 8px;
        }

        .text-danger {
            float: right;
        }

        .img-thumbnail {
            width: 100px;
            height: 100px;
            margin-bottom: 20px;
            margin-top: -10px;
        }

        #avatr_img {
            margin-left: 237px;
        }
    </style>
</head>
<body>

<nav class="navbar navbar-inverse navbar-fixed-top">
    <div class="container">
        <!-- Brand and toggle get grouped for better mobile display -->
        <div class="navbar-header">

            <img src="{{ getstatic }}img/TIM截圖20180205110238.png">
        </div>

        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav navbar-right">
                <li><a href="#">首頁</a></li>
                <li><a href="#">登錄</a></li>
                <li><a href="#">註冊</a></li>
                <li><a href="#">幫助</a></li>
            </ul>
        </div><!-- /.navbar-collapse -->
    </div><!-- /.container-fluid -->
</nav>
<div class="container body-box" style="height: 567px;">
    <div class="center-block body-content">
        <!--頭部提示-->
        <div class="hidden-xs title-top col-sm-12">
            註冊新用戶
            <hr class="head-hr">
        </div>

        <div class="form-wrap">
            <form class="form-horizontal col-sm-8 form-padding" role="form" id="registerForm" method="post"
                  novalidate="novalidate">
                <!--每一行-->
                <div id="avatr_img" class="form-group">

                    <label for="avatar">

                        <img id="avatar_img" class="img-thumbnail" src="{{ getstatic }}img/registersideimg.png" alt="用戶頭像">
                        頭像

                    </label>&nbsp;&nbsp;

                    <input type="file" style="display: none;" id="avatar">
                </div>
                <div class="form-group">
                    <div class="col-sm-2 control-label">
                        <label class="w4-2" for="Email">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</label>
                    </div>
                    <div class="col-sm-10 has-feedback">
                        {{ register_form.email }}
                        <span class="text-danger"></span>
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-sm-2 control-label">
                        <label class="w4-4" for="DisplayName">昵稱</label>
                    </div>
                    <div class="col-sm-10 has-feedback">
                        {{ register_form.nik_name }}
                        <span class="text-danger field-validation-error"><span id="DisplayName-error"></span></span>
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-sm-2 control-label">
                        <label class="w4-2" for="Password">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</label>
                    </div>
                    <div class="col-sm-10 has-feedback">
                        {{ register_form.password }}
                        <span class="text-danger field-validation-error"></span>
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-sm-2 control-label">
                        <label class="w4-4" for="ConfirmPassword">確認密碼</label>
                    </div>
                    <div class="col-sm-10 has-feedback">
                        {{ register_form.repeta_pwd }}
                        <span class="text-danger field-validation-error"><span id="mobile-error"></span></span>

                    </div>
                </div>

                <!--註冊按鈕-->
                <div class="form-group">
                    <div class="col-sm-offset-2 col-sm-10">
                        <span class="col-sm-12 ajax-error"></span>
                        <input id="submitBtn" onclick="regesite()" type="button"
                               class="btn ladda-button center-block cnblogs-btn-blue" value="登錄">
                    </div>
                </div>
                <!--協議提示-->
                <div class="col-sm-offset-2 register-sign">
                    <span class="asterisk">*</span> “註冊” 按鈕,即表示您同意並願意遵守 <a class="look-agreeon" target="_blank"
                                                                           href="//passport.cnblogs.com/agreement.html">用戶協議</a></div>
                <!--hidden-->
                {% csrf_token %}
            </form>
            <div class="hidden-xs col-sm-4 side-img-box">
                <div class="side-line">
                    <div></div>
                </div>
                <img src="{{ getstatic }}img/registersideimg.png">
            </div>
        </div>
    </div>


</div>

<script src="{{ getstatic }}js/jquery-3.2.1.min.js"></script>
<script src="{{ getstatic }}plugins/bootstrap-3.3.7/js/bootstrap.min.js"></script>


</body>
</html>
View Code

上面的代碼只是HTML ,而JavaScript在下麵實例中

<script>
    
    $("#avatar").change(function () {
        var chooice_file = $(this)[0].files[0];
        var reader = new FileReader();// 註意這裡,預覽本地文件
        reader.readAsDataURL(chooice_file);
        reader.onload=function () {
            $("#avatar_img").attr("src",this.result)
        }
    })

    function regesite() {
        var formdata = new FormData(); //z註意這裡  涉及文件上傳
        formdata.append("email",$("#id_email").val());
        formdata.append("nik_name",$("#id_nik_name").val());
        formdata.append("password",$("#id_password").val());
        formdata.append("repeta_pwd",$("#id_repeta_pwd").val());
        formdata.append("valid_img",$("#avatar")[0].files[0]);
        formdata.append("csrfmiddlewaretoken",$("[name='csrfmiddlewaretoken']").val());
        $.ajax({
            url: "{% url "regeste" %}",
            type: "POST",
            data:formdata,
            contentType:false,
            processData:false,
            success: function (data) {
                response_data = JSON.parse(data)
                if(response_data.user){
                    location.href="{% url "login" %}"
                }else {
                    // 清空上次錯誤信息
                    $("form span").html("")
                    $(".has-feedback").removeClass("has-error")
                    $.each(response_data.error_msg,function (fiel, error_info) {
                        // 顯示錯誤信息
                        $("#id_"+fiel).parent().addClass("has-error");
                        $("#id_"+fiel).next().html(error_info[0]);//顯示全局錯誤  // 註意這裡
                        if(fiel=="__all__"){
                            $("#id_repeta_pwd").next().html(error_info[0]).css("color","red")
                        }
                    })
                }

            }

        })
    }
</script>

FileReader

FileReader主要用於將文件內容讀入記憶體,通過一系列非同步介面,可以在主線程中訪問本地文件。

使用FileReader對象,web應用程式可以非同步的讀取存儲在用戶電腦上的文件(或者原始數據緩衝)內容,可以使用File對象或者Blob對象來指定所要處理的文件或數據。

更多關於FileReader()

設計RegisterForm組件

from django import forms
from . import models
from django.forms import widgets
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError


class RegisterForm(forms.Form):
    nik_name = forms.CharField(max_length=32,
                               widget=widgets.TextInput(attrs={"class":"form-control"}),
                               error_messages={"required":"用戶不能為空"})
    email = forms.EmailField(widget=widgets.EmailInput(attrs={"class":"form-control"}),
                             error_messages={"required":"郵箱不能為空", "invalid":"郵箱格式錯誤"})
    password = forms.CharField(min_length=5, widget=widgets.PasswordInput(attrs={"class":"form-control"}),
                               error_messages={"required": "密碼不能為空",
                                               "min_length":"最小長度5位",
                                               }
                               )
    repeta_pwd =  forms.CharField(widget=widgets.PasswordInput(attrs={"class":"form-control"}),
                                  error_messages={"required": "密碼不能為空"})

    def clean_nik_name(self):
        name = self.cleaned_data.get("nik_name")
        users = models.UserInfo.objects.filter(nik_name=name)
        if  not users:
            return name
        else:
            raise ValidationError("用戶已存在")
    def clean(self): //全局鉤子
        pwd = self.cleaned_data.get("password")
        repeta_pwd = self.cleaned_data.get("repeta_pwd")
        if pwd and repeta_pwd:
            if pwd == repeta_pwd:
                return self.cleaned_data
            else:
                raise ValidationError("兩次密碼不一致")
        else:
            return self.cleaned_data

伺服器

    def post(self,request):
        reg_response = {"user": None,"error_msg":""}
        register_form = RegisterForm(request.POST)    // 那麼視圖將再次創建一個表單實例並使用請求中的數據填充它:form = NameForm(request.POST)。這叫做”綁定數據至表單“(它現在是一個綁定的表單)。
        if register_form.is_valid():                 //  is_valid()方法;如果它不為True,我們將帶著這個表單返回到模板。這時表單不再為空(未綁定),所以HTML 表單將用之前提交的數據填充,然後可以根據要求編輯並改正它。           
            email = request.POST.get("email")    //   is_valid()True,我們將能夠在cleaned_data 屬性中找到所有合法的表單數據。在發送HTTP 重定向給瀏覽器告訴它下一步的去向之前,我們可以用這個數據來更新資料庫或者做其它處理。
            nik_name = request.POST.get("nik_name")
            password = request.POST.get("password")
            repeta_pwd = request.POST.get("repeta_pwd")
            valid = request.FILES.get("valid_img")  #註意這裡使用的request.FILES.get("")
            
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10969 Accepted: 4096 Description A network administrator manages a large network. T ...
  • package com.swift.poker; import java.util.ArrayList; import java.util.Collections; /*訓練考核知識點:Collection介面的基本方法、 訓練描述: 按照鬥地主的規則,完成洗牌發牌的動作。 具體規則: 使用54張牌... ...
  • 多態與類型轉換 子類重寫父類方法 1)位置:子類和父類中有同名的方法 2)方法名相同,返回類型和修飾符相同,參數列表相同 方法體不同 多態的優勢和應用場合 多態:同一個引用類型,使用不同的實例而執行不同的操作 實現多態的兩種形式 1.使用父類作為方法形參實現多態 2.使用父類作為方法返回值實現多態 ...
  • 前言 在圖論中,除了在有向圖中的強連通分量,在無向圖中還有一類雙聯通分量 雙聯通分量一般是指 點雙連通分量 當然,還有一種叫做 邊雙連通分量 邊雙聯通分量 對於一個連通圖,如果任意兩點至少存在兩條“邊不重覆”的路徑,則說圖是點雙連通的,邊雙連通的極大子圖稱為邊雙連通分量。 邊雙聯通分量的計算方法比較 ...
  • 前言 在圖論中,除了在有向圖中的強連通分量,在無向圖中還有一類雙連通分量 雙連通分量一般是指 點雙連通分量 當然,還有一種叫做 邊雙連通分量 點雙連通分量 對於一個連通圖,如果任意兩點至少存在兩條“點不重覆”的路徑,則說圖是點雙連通的(即任意兩條邊都在一個簡單環中),點雙連通的極大子圖稱為點雙連通分 ...
  • 最近幾年一直從事地圖方面的工作,自主研發了WPF和Winform兩個版本瓦片地圖引擎。輕量級、不依賴第三庫。先上一張圖片展示一下吧! 產品包括服務端和客戶端兩部份: 1、服務端主要地圖圖層配製和空間計算等,支持mysql,oracle,sqlserver,arcsde和postgis,shp等數據。 ...
  • 解決方案: 1. 調整option中的grid.top值才能避免重疊;(可以設置定製,也可以定義了一個計算公式) 2. 文檔註明【特殊字元串 ''(空字元串)或者 '\n' (換行字元串)用於圖例的換行。】 轉載來源:http://blog.csdn.net/doleria/article/deta ...
  • select和from語句 註意:select和from可以不設置,預設情況下: select獲取映射表的所有欄位; from獲取實體映射表的表名;如果設置select則必須設置frorm,但是允許僅設置from而不設置select Where語句 設置參數 通過@數字設置參數,例如: 定義命名參數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...