노래하듯 이야기하고, 춤추듯 정복하라.

사용자 인증 & 견적보내기 기능 완성 본문

프로젝트/Yes Interior

사용자 인증 & 견적보내기 기능 완성

hyeoke 2017. 11. 15. 22:47

# 서두

YesInterior 페이지의 사용자 인증 기능을 완성하였습니다. 이 부분에서 많은 시행착오가 있었습니다. 처음부터 기본 모델을 사용했으면 금방 끝냈을텐데, User 모델을 확장하고 싶은 마음에 이것 저것 건드리다가 회원가입 폼 부분에서 한참을 삽질한 후 결국 포기했습니다. (이부분이 많이 아쉽네요!)


유저모델을 확장하는 방법에는 프록시 모델 사용하기, User모델과 1대1 연결, 기존 User 모델을 대체(AbstractUser 또는 AbstractBaseUser 사용)하는 방법이 있었습니다. 저 같은 경우에는 새로운 모델(ex -> class Profile)을 만들어 추가적으로 사용할 사용자 정보 필드들을 만들었습니다. 새로운 모델을 만들고, admin.py 코딩을 통해 기존 User 모델 관리 화면에 새로만든 모델의 필드들을 inline 시키는 것 까지 순탄했습니다. 


하지만 회원가입 폼에서 두개의 모델을 연동시킬 방법을 찾아 코딩을 해봤지만 이런 저런 이유로 몇일째 삽질만 했습니다. 더 삽질해봤자 멘탈낭비 시간낭비라 생각되어 내려놓고, 기본 User 모델을 그대로 사용하기로 했네요.. (나중에 시간적 여유가 생긴 후 꼭 다시 도전해 볼 예정입니다!!)


1. 사용자 인증기능


- 사진

< 회원가입 페이지 >


< 로그인 페이지 >

 

- forms.py 소스

from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django import forms
from django.contrib.auth.models import User

class CreateUserForm(UserCreationForm):
    username = forms.RegexField(
        label = "아이디",
        max_length = 30,
        regex = r'^[\w.@+-]+$',
        help_text = "소문자, 숫자, '@\.\+\-\_'만 사용할 수 있으며, 30자 안으로 입력해 주세요.",
        error_messages = { 'invalid': 'id가 중복되었거나 잘못된 문자를 입력하셨습니다. 다시 입력해주세요.' },
        widget = forms.TextInput(
            attrs = {
                'placeholder' : 'id를 입력해주세요.',
                'required': 'true'
            }),
        )

    class Meta: # CreateUserForm에 대한 기술서
        model = User
        fields = ('username', 'email', 'password1', 'password2')
        # ↑모든 필드를 다 보여주고 싶다면, 각각의 필등명이 아닌 "__all__"이라고 적어주면 됨.


위의 소스와 같이 기존의 폼필드를 수정&확장하여 help_text와 label 등을 변경해 주었습니다.


2. 견적보내기 기능


- 사진


- models.py 소스

from django.db import models
from portfolio.fields import ThumbnailImageField
from django.contrib.auth.models import User
# Create your models here.

class Order(models.Model):
    title = models.CharField('제목', max_length=50)
    location = models.CharField('장소', max_length=50)
    date = models.CharField('예상 공사시작 날짜', max_length=20)
    image = ThumbnailImageField('도면 사진', upload_to='photo')
    description = models.TextField('상세설명')
    name = models.CharField('이름', max_length=10)
    phone = models.CharField('휴대폰 번호', max_length=100, blank=True)
    email = models.EmailField('Email')

    create_date = models.DateTimeField('게시일', auto_now_add=True)
    owner = models.ForeignKey(User, null=True)

    class Meta:
        ordering = ('-create_date',)

    def __str__(self):
        return self.title

견적 보내기 기능은 Order 라는 별도의 앱을 생성하여 개발했습니다. 이기능의 핵심은 관리자가 사용자가 보낸 견적내용을 쉽게 알아보게 하기 위해 도면같은 사진 이미지를 첨부할 수 있게 하였고, 이미지필드는 포트폴리오 앱에서 개발해놓은 커스텀 필드를 그대로 import 하여 재활용하였습니다.


* 견적보내기 기능 개발중 있었던 문제.. (상당히 힘들었다는..)

제가 겪은 문제는 바로 "OperationalError"였습니다. 구글링을 해보니 주요 원인은 프로젝트 데이터베이스안에서 테이블 혹은 테이블의 칼럼들과 models.py 코드간의 충돌이었습니다. 이러한 충돌이 일어나는 이유는 데이터의 입출력이 있은 이후, 모델을 수정하여 생기는 것이었습니다. 구글링을 해보니 초보자입장에서 상당히 까다로운 오류로 알려지는 것 같습니다. 


하지만 간단히 해결할 수 있는 방법이 있더군요 !


** 여기서 꿀Tip -> "OperationalError" 간편하게 해결하기

1. 프로젝트의 sqlite 파일 삭제

2. 각 앱마다 pycash 폴더 삭제

3. 각 앱의 migration 폴더 안을 모두 비우기 (단, __init__.py 파일은 남겨두기!)

4. cmd창에서 프로젝트 디렉토리 이동 후 가상환경 활성화

5. python manage.py makemigrations 진행

6. python manage.py migrate 진행

7. 슈퍼유저 생성 -> python manage.py createsuperuser

-> 문제 해결 ^^

Comments