Python/Django Framework

[Python Django] 2-2. FBV 함수를 이용한 Create 구현

Jake the Dog 2022. 3. 26. 09:27
반응형

함수를 이용한 CREATE 구현

  • views.py와 html 템플릿만을 이용한 가장 단순한 방식의 코드입니다.
  • user/views.py
from django.contrib.auth.hashers import make_password
from django.shortcuts import render

from user.models import User


def create(request):
    if request.method == 'GET': # method가 GET이면 유저 생성 페이지를 보여준다
        return render(request, 'create.html')
    elif request.method == 'POST': # method가 POST이면 유저를 생성한다
        # 전달받은 인자값을 정리한다
        user_name = request.POST.get("user_name", None)
        user_email = request.POST.get("user_email", None)
        password = request.POST.get("password", None)
        re_password = request.POST.get("re_password", None)

        res_data = {} # 결과 데이터를 보낼 set 생성

        if not (user_name and user_email and password and re_password):# 무결성 검사
            res_data['error'] = '모든 값을 입력해주세요'
        elif password != re_password: # 패스워드 확인
            res_data['error'] = '패스워드를 확인해주세요'
        else: # 저장
            user = User(
                user_name=user_name,
                user_email=user_email,
                password=make_password(password)
            )
            user.save() # user 모델에 세팅된 값을 저장한다

        if res_data.get('error'):
            # POST로 전달받은 값 중 user_name, user_email을 전달한다. 보안상 password 정보는 제외
            res_data['preset'] = {'user_name': user_name, 'user_email': user_email}
            # POST로 전달받은 전체 값을 전송하려면
            # res_data['preset'] = request.POST
            return render(request, 'create.html', res_data)
        else:
            # 성공하더라도 아직 다른 페이지가 없는 관계로 create 페이지로 돌아간다.
            # admin 페이지에서 user가 생성되었는지 확인한다.
            return render(request, 'create.html', res_data)
  • user/templates/create.html
{% extends "base.html" %}
{% block contents %}
    <div class="row mt-5">
        <div class="col-12 text-center">
            <h1>회원가입</h1>
        </div>
    </div>
    <div class="row mt-5">
        <div class="col-12">
            {{ error }}
        </div>
    </div>
    <div class="row mt-5">
        <div class="col-12">
            <form method="POST" action=".">
                {% csrf_token %}
                <div class="mb-3">
                    <label for="user_name">사용자 이름</label>
                    <input type="text" class="form-control" id="user_name" placeholder="사용자 이름" name="user_name"
                           value="{{ preset.user_name }}"/>
                </div>
                <div class="mb-3">
                    <label for="user_email">사용자 이메일</label>
                    <input type="email" class="form-control" id="user_email" placeholder="사용자 이메일" name="user_email"
                           value="{{ preset.user_email }}"/>
                </div>
                <div class=" mb-3">
                    <label for="password">비밀번호</label>
                    <input type="password" class="form-control" id="password" placeholder="비밀번호" name="password"/>
                </div>
                <div class="mb-3">
                    <label for="re_password">비밀번호 확인</label>
                    <input type="password" class="form-control" id="re_password" placeholder="비밀번호 확인"
                           name="re_password"/>
                </div>
                <div class="d-grid mt-3">
                    <button class="btn btn-lg btn-primary" type="submit">회원가입</button>
                </div>
            </form>
        </div>
    </div>
{% endblock %}
반응형