本物のモールを達成するためのDjangoプロジェクトの登録事業

フロントエンドの設計知識へ

パーシャルリフレッシュを実現するためにVUEを使用して、プロジェクトのフロントページ、結合双方向データ、需要に次の一見、を介してユーザと対話するユーザー入力、確認するいくつかの簡単なルールを実行する前の必要性の後、我々はユーザーが欲しいですエラーが発生した場合のリアルタイム検出を入力した後、入力ボックスの下に表示することができます。

<li>
    <label>用户名:</label>
    <input type="text" name="username" id="user_name">
    <span class="error_tip">请输入5-20个字符的用户</span>
</li>
<li>
    <label>密码:</label>
    <input type="password" name="password" id="pwd">
    <span class="error_tip">请输入8-20位的密码</span>
</li>

上記ユーザーがユーザー名を入力すると、ユーザーとパスワードの入力ボックスで、カーソルは、問題の入力が、エラーメッセージが入力ボックスの下に表示される入力ボックス、入力精度のリアルタイム検出、適時性を、終了します。

結合双方向のデータを達成するために、Vモデル、イベント結合、Vショー表示制御DOM Vオンか否かを、次のコードが部分VUEに添加されます

<li>
    <label>用户名:</label>
    <input type="text" name="username" id="user_name" v-model="username" @blur="check_username">
    <span class="error_tip" v-show="error_name">[[error_name_message]]</span>
</li>
<li>
    <label>密码:</label>
    <input type="password" name="password" id="pwd" v-model="password" @blur="check_password">
    <span class="error_tip" v-show="error_password">请输入8-20位的密码</span>
</li>

ユーザがユーザ名とユーザ名の変数が結合入り、カーソル消滅文字列変数error_name_messageは、他の入力ボックスは、この操作に類似しているかどうかを制御するために、ブール変数ERROR_NAMEに結合することにより結合時間check_username、V-ショーをトリガします。

達成するために、登録事業

フロントエンドのビジネス・ロジック登録

登録フォームコード:

<form method="post" class="register_form" >
    {{ csrf_input }}
    <ul>
        <li>
            <label>用户名:</label>
            <input type="text" name="username" id="user_name" v-model="username" @blur="check_username">
            <span class="error_tip" v-show="error_name">[[error_name_message]]</span>
        </li>
        <li>
            <label>密码:</label>
            <input type="password" name="password" id="pwd" v-model="password" @blur="check_password">
            <span class="error_tip" v-show="error_password">请输入8-20位的密码</span>
        </li>
        <li>
            <label>确认密码:</label>
            <input type="password" v-model="password2" @blur="check_password2" name="password2"
                   id="cpwd">
            <span class="error_tip" v-show="error_password2">两次输入的密码不一致</span>
        </li>
        <li>
            <label>手机号:</label>
            <input type="text" v-model="mobile" @blur="check_mobile" name="mobile" id="phone">
            <span class="error_tip" v-show="error_mobile">[[ error_mobile_message ]]</span>
        </li>

        <li>
            <label>图形验证码:</label>
            <input type="text" name="image_code" id="pic_code" class="msg_input">
            <img src="{{ static('images/pic_code.jpg') }}" alt="图形验证码" class="pic_code">
            <span class="error_tip">请填写图形验证码</span>
        </li>
        <li>
            <label>短信验证码:</label>
            <input type="text" name="sms_code" id="msg_code" class="msg_input">
            <a href="javascript:;" class="get_msg_code">获取短信验证码</a>
            <span class="error_tip">请填写短信验证码</span>
        </li>
        <li class="agreement">
            <input type="checkbox" name="allow" id="allow" v-model="allow" @change="check_allow">
            <label>同意”商城用户使用协议“</label>
            <span class="error_tip" v-show="error_allow">请勾选用户协议</span>
        </li>
        <li class="reg_sub">
            <input type="submit" value="注 册" @change="on_submit">
            {% if register_errmsg %}
                <span class="error_tip2">{{ register_errmsg }}</span>
            {% endif %}
        </li>
    </ul>
</form>

JSライブラリと導入AJAX要求vue.js

<script type="text/javascript" src="{{ static('js/vue-2.5.16.js') }}"></script>
<script type="text/javascript" src="{{ static('js/axios-0.18.0.min.js') }}"></script>

文書作成register.js

register.js文書は主に対話イベント登録ページを処理し、サーバーへの登録フォーム要求を提出します

<script type="text/javascript" src="{{ static('js/register.js') }}"></script>

ここでは論理的なフォームの送信と検証ロジックのフロントエンドであります

methods: {
    // 校验用户名
    check_username() {
        let re = /^[a-zA-Z0-9_-]{5,20}$/;
        if (re.test(this.username)) {
            this.error_name = false;
        } else {
            this.error_name_message = '请输入5-20个字符的用户名';
            this.error_name = true;
        }
    },
    // 校验密码
    check_password() {
        let re = /^[0-9A-Za-z]{8,20}$/;
        this.error_password = !re.test(this.password);
    },
    // 校验确认密码
    check_password2() {
        if (this.password !== this.password2) {
            this.error_password2 = true;
        } else {
            this.error_password2 = false;
        }
    },
    // 校验手机号
    check_mobile() {
        let re = /^1[3-9]\d{9}$/;
        if (re.test(this.mobile)) {
            this.error_mobile = false;
        } else {
            this.error_mobile_message = '您输入的手机号格式不正确';
            this.error_mobile = true;
        }
    },
    // 校验是否勾选协议
    check_allow() {
        this.error_allow = !this.allow;
    },
    // 监听表单提交事件
    on_submit() {
        this.check_username();
        this.check_password();
        this.check_password2();
        this.check_mobile();
        this.check_allow();
                # 输入字段中有一个不符合规则就禁止
        if (this.error_name === true || this.error_password === true || this.error_password2 === true
            || this.error_mobile === true || this.error_allow === true) {
            // 禁用表单的提交
            window.event.returnValue = false;
        }
    },
}

バックエンドのビジネス・ロジック登録

ユーザーがユーザー名の入力を終えた後、私たちは多くの場合、このユーザー名は、需要に合わせて登録されていると速い与えることができるようにしたいだけのルールの前にユーザー名をチェックして、彼はすでにシステムに登録されたか、あるいはしていたかどうかを知りたいと思いましたあなたが登録のために提出し、ユーザー名や電話番号が登録されている与える入力が完了したら、経験は特に良くありません。カーソルは、登録されたか否かを判断するためにサーバーのリクエストに応じてユーザ名入力ボックスを残すために必要がある場合。

ルートを定義します

path('register/', views.RegisterView.as_view(), name='register'),  # name添加命名空间
path('usernames/<str:username>', views.UsernameCountView.as_view(), name="username"),
re_path(r'mobiles/(?P<mobile>1[3-9]\d{9})', views.MobileCountView.as_view(), name='mobile')

書き込みビュークラス

class UsernameCountView(View):

    def get(self, request, username):
        """
        查询该用户名是否在系统中存在
        :param request: 请求对像
        :param username: 前端传递的用户名
        :return:
        """
        count = User.objects.filter(username=username).count()
        return http.JsonResponse({'code':1001, 'msg':'用户已存在'}) if count == 1 \
            else http.JsonResponse({'code': 1000, 'msg': ''})

統一された応答パッケージなし完了した取引はありませんが、後に具体的に説明しています。

登録は、ビュークラスに書き込まれます。

class RegisterView(View):
    """用户注册视图类"""

    def get(self, request):
        '''获取注册页面'''
        return render(request, 'register.html')

    def post(self, request):
        """"""
        username = request.POST.get('username')
        password = request.POST.get('password')
        password2 = request.POST.get('password2')
        mobile = request.POST.get('mobile')
        allow = request.POST.get('allow')
        # 判断参数是否齐全
        if not all([username, password, password2, mobile, allow]):
            return http.HttpResponseForbidden('缺少必传参数')
        # 判断用户名是否是5-20个字符
        if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', username):
            return http.HttpResponseForbidden('请输入5-20个字符的用户名')
        # 判断密码是否是8-20个数字
        if not re.match(r'^[0-9A-Za-z]{8,20}$', password):
            return http.HttpResponseForbidden('请输入8-20位的密码')
        # 判断两次密码是否一致
        if password != password2:
            return http.HttpResponseForbidden('两次输入的密码不一致')
        # 判断手机号是否合法
        if not re.match(r'^1[3-9]\d{9}$', mobile):
            return http.HttpResponseForbidden('请输入正确的手机号码')
        # 判断是否勾选用户协议
        if allow != 'on':
            return http.HttpResponseForbidden('请勾选用户协议')

        try:
            user = User.objects.create_user(username=username, password=password, mobile=mobile)
        except DatabaseError as e:
            return render(request, 'register.html', {'register_errmsg': e.args})

        # 注册成功保存会话
        login(request, user)

        return redirect(reverse('contents:index'))

提供ジャンゴログイン方法は、私たちはすぐにユーザーにログインし、ユーザ認証を通じて、固有の識別情報を、状態遺骨を実装するために支援し、セッションの書き込み動作をカプセル化:(ユーザーIDなど)現在のブラウザとクッキーへの書き込みサーバ側のセッション。

request.session[SESSION_KEY] = user._meta.pk.value_to_string(user)
request.session[BACKEND_SESSION_KEY] = backend
request.session[HASH_SESSION_KEY] = session_auth_hash

セッションは、プロジェクトの作成に保存された以前のセッション構成へのRedis、に入金されます

SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"

ようこそ誰も私のブログシュシュ、戦闘ああのテストについての詳細があります!

おすすめ

転載: www.cnblogs.com/zyjimmortalp/p/12464883.html