반원 블로그

django - 이메일 필드 추가 본문

2018~/Django 개인 공부 정리

django - 이메일 필드 추가

반원_SemiCircle 2019. 9. 6. 17:34

1. 이메일 필드 models.py에 정의

useremail을 추가하기위해서 models.py 에서 코드 삽입

이메일이니 EmailField를 사용하여 도메인 형태를 알아서 필터하도록 작성

from django.db import models

# Create your models here.


class Fuser(models.Model):  # models.Model를 상속
    username = models.CharField(max_length=32,
                                verbose_name='사용자명'  # admin 페이지에서 보일 컬럼명
                                )
    useremail = models.EmailField(max_length=128,      
                                verbose_name='사용자이메일'  # admin 페이지에서 보일 컬럼명
                                )
    #5~7을 드래그 한뒤 Alt+Shift+Down하면 편함
    password = models.CharField(max_length=64,
                                verbose_name='비밀번호'  # admin 페이지에서 보일 컬럼명
                                )
    register_dttm = models.DateField(auto_now_add=True, # 자동으로 해당 시간이 추가됨
                                     verbose_name="가입날짜"
                                     )


    #데이터가 문자열로 변환이 될 때 어떻게 나올지(반환해줄지) 정의하는 함수가 __str__이다.
    def __str__(self):
        return self.username


    #별도로 테이블명을 지정하고 싶을 때 쓰는 코드(안해도 됨)
    class Meta:
        db_table = 'user_define_fuser_table' #테이블 명 지정
        verbose_name = '사용자 모임' #노출될 테이블 이름 변경
        verbose_name_plural = '사용자 모임'

2. 마이그레이션 제작

프로젝트 폴더 위치에서 python manage.py makemigrations 이후 python manage.py migrate

이미 기존에 DB가 있는데, 새로운 컬럼이 생겨나니 나오는 문구다.

1번같은 경우는 여기서 직접 입력해주는 것이고, 2번은 EmailFiled 작성시 default 매개변수를 지정할 수 있다.

여기서는 일단 1번으로 진행하고 'undefine@example.com'으로 입력

3. 페이지에 email 입력받게 변경

1~2 수행하기전에 먼저 해도 되긴하다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>

    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">

    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
</head>
<body>
    <div class="container">
        <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="form-group">
                        <label for="username">사용자 이름 입력</label>
                        <input type="text" class="form-control" id="username" name="username"  placeholder="사용자이름">
                    </div>
                    <div class="form-group">
                        <label for="useremail">사용자 이메일 입력</label>
                        <input type="email" class="form-control" id="useremail" name="useremail"  placeholder="사용자 이메일">
                    </div>
                    <div class="form-group">
                        <label for="password">비밀번호 입력</label>
                        <input type="password" class="form-control" id="password" name="password" placeholder="비밀번호">
                    </div>
                    <div class="form-group">
                        <label for="re-password">비밀번호 확인</label>
                        <input type="password" class="form-control" id="re-password" name="re-password" placeholder="비밀번호 확인">
                    </div>
                    <button type="submit" class="btn btn-primary">Submit</button>
                </form>
            </div>
        </div>

    </div>
</body>
</html>

 

4. 웹 페이지(즉 템플릿)과 연결된 뷰(V)를 작업

views.py에서 requests에 useremail도 들어올테니, 이를 fuser클래스로 인스턴스를 만들고 DB에 저장하는 코드를 작성하자. (useremail 변수 생성, 유효성 검사, Fuser에 추가)

from django.shortcuts import render
from .models import Fuser
from django.http import HttpResponse
from django.contrib.auth.hashers import make_password

# Create your views here.

def register(request):
    if request.method == "GET":
        return render(request, 'register.html')
    elif request.method == "POST":
        #여기에 회원가입 처리 코드
        # username = request.POST['username']
        # password = request.POST['password']
        # re_password = request.POST['re-password']
      
        username = request.POST.get('username',None)
        password = request.POST.get('password',None)
        re_password = request.POST.get('re-password',None)
        useremail = request.POST.get('useremail',None)


        res_data ={} #프론트에 던져줄 응답 데이터

        #모든 값을 입력해야됨
        if not( username and password and re_password and useremail): #None은 False로 인식
            res_data['error']="모든 값을 입력해야합니다."
        #비밀번호가 다르면 리턴
        elif password != re_password:
            # return HttpResponse("비밀번호가 다름")
            res_data['error']="비밀번호가 다름"
        #같으면 저장
        else : 
            #위 정보들로 인스턴스 생성
            fuser = Fuser(
                username= username,
                password= make_password(password),
                useremail = useremail
            )
            
            #저장
            fuser.save()

        return render(request, 'register.html',res_data)

5. 구동하여 확인해보자. 잘 저장된다.

python manage.py runserver

 

6. 그런데 admin 페이지에서 나오진 않을 것이다. 이를 추가하려면 앱 폴더의 admin.py를 수정하자.

from django.contrib import admin
from .models import Fuser

# Register your models here.

class FuserAdmin(admin.ModelAdmin): #admin의 ModelAdmin 클래스를 상속
    # pass #상속만 받아 새로운 클래스를 생성
    list_display = ('username','password','useremail')

admin.site.register(Fuser,FuserAdmin) #admin 페이지에 등록

Comments