django会員加入関数に基づく基本論理


アプリケーション・フロー



Urls

# vi config/urls.py
# include 함수를 사용해 127.0.0.1:8000/account/이하 url은 account/urls.py 의
  urlpatterns를 포함해서 url을 찾는다.
  
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
]

urlpatterns += [
    path('account/', include('account.urls'))
]


# vi account/urls.py
# path 함수를 사용해 요청받을 url을 설정하고 해당 view를 맵핑 

from django.urls import path
from . import views

urlpatterns = [
    path('register/', views.register),
] 

Models


モデルって何?
モデルは、データベースで作成するテーブルの概念です.
モデルは、表の列に対応する1つ以上のフィールドで構成されます.
モデルインスタンスの作成は、テーブル内のコンセプトを実際に存在するオブジェクトにするように具体化します.すなわち,テーブルで右を生成する.
ユーザーがアイデンティティ、パスワード、Eメール、登録日のデータを持つ必要があると仮定し、モデルを設計します.詳細フィールドおよび属性については、正式な書類を参照してください.
現在、設計モデルは難しくないが、プロジェクト規模の拡大に伴い、複雑性が高まり、設計モデルにも専門知識が必要である.
また,認証定義ユーザモデルに関する4つの方法を学習する必要がある.
# vi account/models.py
from django.db import models

class User(models.Model):
    username = models.CharField(max_length=64, verbose_name = '아이디')
    password = models.CharField(max_length=64, verbose_name = '비밀번호')
    email = models.EmailField(max_length=64, verbose_name = '이메일')
    registered_at = models.DateTimeField(auto_now_add=True, verbose_name = '가입일자')

    class Meta:
        db_table = 'user'             
        ordering = ['-registered_at']
        verbose_name = '사용자'
        verbose_name_plural = '사용자'
        
    def __str__(self):
        return self.username

Views

# vi account/views.py
from django.shortcuts import render
from django.contrib.auth.hashers import make_password
from account.models import User

def register(request):

    # GET 방식 요청 -> 회원가입 페이지 요청 
    if request.method == 'GET':
        return render(request, 'register.html')

    # POST 방식 요청 -> 사용자가 보낸 데이터를 데이터베이스에 저장
    elif request.method == 'POST':
    
        # client에게 입력받은 값을 가져온다. 
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)
        re_password = request.POST.get('re_password', None)
        email = request.POST.get('email',None)
        
        # 템플릿에 넘길 응답 데이터 
        res_data={}
        
        # 유효성 검사1 - 값을 모두 채우지 않는 경우
        if not (username and password and re_password and email):
            res_data['error'] = '모든값을 입력해야 합니다.'
            
        # 유효성 검사2 - 비밀번호와 확인-비밀번호가 다른 경우
        elif password != re_password:
            res_data['error'] = '비밀번호가 일치하지 않습니다.'
            
        # 모든 값을 입력받고 비밀번호가 일치하는 경우 User의 인스턴스를 생성 
        # make_password 를 사용해 비밀번호 보안
        else:
            user = User(
                username=username,
                password=make_password(password),
                email=email
            )
				
            # 데이터베이스에 저장 
            user.save()
        
        # res_data = {'error':''} 에러 메세지를 전달
        return render(request, 'register.html', res_data)

Templates


サーバ応答ユーザのファイル
処理したデータをviewから取得することで動的に作成できます
# vi config/settings.py
# APP_DIRS: True 장고는 어플리케이션 디렉토리에서 templates 디렉토리를 찾는다.
# DIRS 설정가능 

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

# vi account/templates/base.html
# 템플릿 문법을 사용해 반복되는 코드에 변하는 코드만 block 처럼 끼워 넣을 수 있다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <div class="container">
        {% block content %}
        {% endblock %}
    </div>
</body>
</html>

# vi account/templates/register.html
# form 을 직접 생성
# input 태그의 name 속성을 통해 {'name':value} 형태로 값을 전달
# {% csrf_token %} 보안을 위해 랜덤한 토큰값을 생성 

{% extends 'base.html' %}
{% block content %}
<form method="post" action=".">
  {% csrf_token %}

    <label for="username" >사용자 이름</label>
    <input type="text" id="username"placeholder="사용자 이름" name="username">

    <label for="email">이메일</label>
    <input type="email" id="email" placeholder="이메일" name="email">

    <label for="password">비밀번호</label>
    <input type="password" id="password" placeholder="비밀번호" name="password">

    <label for="re-password">비밀번호 확인</label>
    <input type="password"id="re-password" placeholder="비밀번호 확인" name="re_password">

    <button type="submit">가입</button>
    
</form>
{% endblock %}