본문으로 바로가기

회원가입 기능 구현

category 프로젝트 이야기/코드 2019. 6. 9. 14:22

forms.py 

- USERNAME 필드를 email 필드로 재정의(USERNAME = email)

- fields 의 모든 템플릿 속성에 대해서 class=form_control 을 생성자 함수를 통해서 선언

class SignupForm(UserCreationForm):
    email = forms.EmailField(label='아이디(이메일 형식)')
    name = forms.CharField(max_length=10, label='이름')
    password1 = forms.PasswordInput()
    password2 = forms.PasswordInput()
    alias = forms.CharField(max_length=50, label='닉네임')
    gender = forms.CharField(label='성별', widget=forms.Select(choices=CHOICE_GENDER))
    profile_img = forms.ImageField(label='프로필 이미지(선택)', widget=forms.ClearableFileInput(), required=False)
    cover_img = forms.ImageField(label='커버 이미지(선택)', widget=forms.ClearableFileInput(), required=False)
    introduce = forms.CharField(label='자기소개', widget=forms.Textarea)

    class Meta:
        model = User
        fields = ['email', 'password1', 'password2', 'name', 'alias',
                  'gender', 'profile_img', 'cover_img', 'introduce']

    def __init__(self, *args, **kwargs):
        super(SignupForm, self).__init__(*args, **kwargs)
        # field 의 모든 템플릿 속성에 class=form-control 적용
        for field_name, field in self.fields.items():
            field.widget.attrs['class'] = 'form-control'

 

views.py

- 바인딩 되는 데이터는 정보가 URL 에 노출되어서는 안되므로 request.POST

- SignupForm() 에서 들어오게되는 인자는 POST, FILES 순서로 꼭 들어와야 함

- validation(is_valid): 각 form 에 맞는 데이터가 바인딩 되는지 확인

(예를 들면 email 필드인데 email 형식이 아닐 경우, validation 에 걸리게 됨)

- authenticate(): 아이디/비밀번호를 매칭시켜 DB 에 있는 정보와 일치하는지를 검사

def signup_view(request):
    """
    UserCreationForm 을 사용

    email, password1 을 form 에서 받아서 authenticate 한 이후 로그인 처리
    """
    if request.method == 'POST':
        form = SignupForm(request.POST, request.FILES)
        if form.is_valid():
            email = form.cleaned_data['email']
            password1 = form.cleaned_data['password1']
            form.save()
            user = authenticate(request, email=email, password=password1)
            login(request, user)
            return redirect('product:category-list')
    else:
        form = SignupForm()
    context = {
        'form': form,
    }
    return render(request, 'members/signup.html', context)

'프로젝트 이야기 > 코드' 카테고리의 다른 글

장바구니 기능 구현하기  (0) 2019.06.08