728x90

Bootstrap UI에 회원가입시 에러메시지 처리 기능 대신에 jQuery Ajax 처리를 통해서 회원가입 방법을 테스트하고 적어둔다.

 

기존 views.py

from django.core.mail.backends import console
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render, redirect
from django.contrib.auth.hashers import make_password, check_password
from .models import User
 
# Create your views here.
def register(request):
    if request.method == 'GET':
        return render(request, 'register.html')
    elif request.method == 'POST':
        username = request.POST.get('username',None)
        useremail = request.POST.get('useremail',None)
        password = request.POST.get('password',None)
        repasswd = request.POST.get('repasswd',None)
 
        res_data ={}
        if not (username and useremail and password and repasswd):
            res_data['error'= '모든 값을 입력해야 합니다.'
        elif password != repasswd:
            res_data['error'='비밀번호가 다릅니다.'
        else:
            user = User(
                username = username,
                useremail = useremail,
                password = make_password(password)
            )
            user.save()
 
        return render(request,'register.html',res_data)

 

회원 가입 UI 처리를 위해서 base.html 파일과 register.html 파일로 분리했다.

base.html

 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
    <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
<div class="container">
    {% block contents %}
    {% endblock %}
</div>
</body>
</html>
 

 

 

register.html

장고 테이블에 회원정보를 저장하기 위해서는 name="username" 이라고 적어야 하지만, jQuery 로 처리하려고 id="usernmae" 으로 변경했다.

하단 <script></script> 사이에 Javascript 코드를 구현해야 한다. js 코드만 별도로 분리하는 것은 static 폴더에 넣으면 된다.

{% extends "base.html" %}
{% block contents %}
    <div class="signup-form pt-5">
        <form method="post" id="post-form" action=".">
            {% csrf_token %}
            <h2>회원가입</h2>
            <div class="form-group">
                <div class="row">
                    <div class="col">
                        <input type="text" class="form-control" id="username" placeholder="사용자 이름" required="required" />
                    </div>
                </div>
            </div>
            <div class="form-group">
                <input type="email" class="form-control" id="useremail" placeholder="Email" required="required"/>
            </div>
            <div class="form-group">
                <input type="password" class="form-control" id="password" placeholder="비밀번호" required="required">
            </div>
            <div class="form-group">
                <input type="password" class="form-control" id="repasswd" placeholder="비밀번호 확인"
                       required="required">
            </div>
            <div class="form-group">
                <button type="submit" class="btn btn-success btn-lg btn-block">회원 등록</button>
            </div>
        </form>
        <div class="text-center"><a href="#">로그인</a></div>
    </div>
    <script>
        $(document).on('submit''#post-form'function (e) {
            e.preventDefault();
            if ($("#username").val() == '') {
                alert('이름을 입력하세요');
                $("#username").focus();
                return false;
            }
            if ($('#useremail').val() == '') {
                alert('email을 입력하세요');
                $('#useremail').focus();
                return false;
            }
 
            var pwd = $("#password");
            var repwd = $("#repasswd");
            if (PasswordChk(pwd, repwd) == falsereturn false;
 
            $.ajax({
                type: 'POST',
                url: '{% url "accounts:ajax_register" %}',
                data: {
                    username: $('#username').val(),
                    useremail: $('#useremail').val(),
                    password: $('#password').val(),
                    csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
                    action: 'post'
                },
                success: function (json) {
                    if (json.status == 1) {
                        document.getElementById("post-form").reset();
                        window.location.href = 'http://127.0.0.1:8000/';
                        alert('등록되었습니다.');
                    } else if (json.status == 0) {
                        alert('이미 등록된 회원입니다.');
                    }
                },
                error: function (xhr, errmsg, err) {
                    alert('에러가 발생했네요.' + errmsg);
                    console.log(xhr.status + ": " + xhr.responseText);
                }
            });
        });
 
        function PasswordChk(pwd, repwd) {
            if (pwd.val() == '') {
                alert('비밀번호를 입력하세요');
                pwd.focus();
                return false;
            }
            if (pwd.val().indexOf(' '> -1) {
                alert("공백은 입력할 수 없습니다.");
                return false;
            }
 
            var check1 = /^(?=.*[a-zA-Z])(?=.*[0-9]).{10,15}$/.test(pwd.val()); //영문,숫자
            var check2 = /^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[^a-zA-Z0-9]).{8,15}$/.test(pwd.val()); //영문,숫자,특수문자
            var check3 = /^(?=.*[a-zA-Z])(?=.*[^a-zA-Z0-9]).{10,15}$/.test(pwd.val()); //영문,특수문자
            var check4 = /^(?=.*[^a-zA-Z0-9])(?=.*[0-9]).{10,15}$/.test(pwd.val()); //특수문자, 숫자
            if (!(check1 || check2)) {
                alert("영문/숫자 혼용시에는 10~15자리를 사용해야 합니다.\n영문/숫자/특수문자 혼용시에는 8~15자리를 사용해야 합니다.");
                return false;
            }
 
            // 동일한 문자/숫자 4자 이상
            if (/(\w)\1\1\1/.test(pwd.val())) { // /(\w)\1\1/.test(pwd)
                alert("같은 문자를 4번 이상 사용할 수 없습니다.");
                pwd.focus();
                return false;
            }
            if (isContinuedValue(pwd.val())) {
                alert("비밀번호에 4자 이상의 연속 문자 또는 숫자를 사용하실 수 없습니다.");
                pwd.focus();
                return false;
            }
 
            if (repwd.val() == '') {
                alert('비밀번호를 다시 한번 더 입력하세요');
                repwd.focus();
                return false;
            }
            if (pwd.val() !== repwd.val()) {
                alert('비밀번호를 둘다 동일하게 입력하세요');
                return false;
            }
            return true;
        }
 
        function isContinuedValue(value) {
            console.log("value = " + value);
            var intCnt1 = 0;
            var intCnt2 = 0;
            var temp0 = "";
            var temp1 = "";
            var temp2 = "";
            var temp3 = "";
 
            for (var i = 0; i < value.length - 3; i++) {
                temp0 = value.charAt(i);
                temp1 = value.charAt(i + 1);
                temp2 = value.charAt(i + 2);
                temp3 = value.charAt(i + 3);
 
                if (temp0.charCodeAt(0- temp1.charCodeAt(0== 1
                    && temp1.charCodeAt(0- temp2.charCodeAt(0== 1
                    && temp2.charCodeAt(0- temp3.charCodeAt(0== 1) {
                    intCnt1 = intCnt1 + 1;
                }
 
                if (temp0.charCodeAt(0- temp1.charCodeAt(0== -1
                    && temp1.charCodeAt(0- temp2.charCodeAt(0== -1
                    && temp2.charCodeAt(0- temp3.charCodeAt(0== -1) {
                    intCnt2 = intCnt2 + 1;
                }
            }
            return (intCnt1 > 0 || intCnt2 > 0);
        }
    </script>
{% endblock %}
 

 

 

models.py

models.py 파일은 데이터베이스 테이블을 만들고 그 안의 필드들을 생성 및 수정할 수 있는 역할을 한다.
혹시라도 칼럼을 추가할 경우에는 DB 를 삭제하고 다시 하는 것이 속 편하다. 그러므로 처음부터 칼럼 설계를 잘하자.
# models.py
from django.db import models
 
# Create your models here.
class User(models.Model):
    username = models.CharField(max_length=32, verbose_name='사용자명',default='')
    useremail = models.EmailField(max_length=128, verbose_name='emailID',default='')
    password = models.CharField(max_length=128,verbose_name='비밀번호')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='등록시간')
    updated_at = models.DateTimeField(auto_now=True)
 
    def __str__(self):
        return self.email
 
    class Meta:
        db_table = 'accounts'
        verbose_name = '사용자'
        verbose_name_plural = '사용자'
 

 

수정 views.py

from django.core.mail.backends import console
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render, redirect
from django.contrib.auth.hashers import make_password, check_password
from .models import User
 
# Create your views here.
def home(reqest):
    user_id = reqest.session.get('user')
 
    if user_id:
        user = User.objects.get(pk=user_id)
        return HttpResponse(user.useremail)
 
    return HttpResponse('Home')
 
def register(request):
    if request.method == 'GET':
        return render(request, 'register.html')
    elif request.method == 'POST':
        username = request.POST.get('username',None)
        useremail = request.POST.get('useremail',None)
        password = request.POST.get('password',None)
 
        res_data ={}
        try:
            user = User.objects.get(useremail=useremail)
            if user:
                res_data['status'= '0' # 기존 가입된 회원
                return JsonResponse(res_data)
        except User.DoesNotExist:
            # 대문자 User 임에 주의
            user = User(
                username = username,
                useremail = useremail,
                password = make_password(password)
            )
            user.save()
            # session 생성
            user = User.objects.get(useremail=useremail)
            request.session['user'= user.id
            res_data['status'= '1' # 회원 가입 완료
            return JsonResponse(res_data)
 
        return render(request,'register.html',res_data)
 
 
def logout(request):
    if request.session.get('user'):
        del(request.session['user'])
 
    return redirect('/user/login')
 
 

 

 

app urls.py

# app urls.py
from django.urls import path
from . import views
 
app_name = 'accounts'
urlpatterns = [
    path('register/', views.register, name='ajax_register'), # name = that we will use in ajax url
    path('login/', views.login, name='ajax_login'),
    path('logout/',views.logout),
]
 
 

 

project urls.py

# project urls.py
from django.contrib import admin
from django.urls import path,include
from accounts.views import home
 
urlpatterns = [
    path('admin/', admin.site.urls),
 
    # path('', views.HomeView.as_view(), name='home'),
    path('user/', include('accounts.urls')),
    path('', home)
]
 

 

admin.py

# admin.py
from django.contrib import admin
from .models import User
 
# Register your models here.
class UserAdmin(admin.ModelAdmin):
    list_display = ('username','useremail','password','created_at','updated_at')
 
admin.site.register(User,UserAdmin)
블로그 이미지

Link2Me

,