BravePeach / bravepeach_web

BravePeach WebServer with Django
1 stars 0 forks source link

회원가입 형태를 수정하니 유저가 생성 안되는 오류 #13

Open DaehanKim opened 7 years ago

DaehanKim commented 7 years ago

image

현재 회원가입 폼 형태입니다.

사진 업로드는 s3에 연결 안되어서 일단 빼놨습니다.

django-widget-tweaks를 이용해서 일단은 정형화된 형태가 아닌 userRegistrationForm과 ProfileEditForm을 모두 불러서 원하는 형태로 배치하기는 했습니다. 그런데 submit을 했을 때 user가 생성이 안되네요.. 분명 모델상에서는 profile은 모두 null값이 허용되어서 사진이 안들어가도 생성이 가능해야 하는데요..

models.py :

class UserRegistrationForm(forms.ModelForm):
    password = forms.CharField(label='Password',
                               widget=forms.PasswordInput)
    password2 = forms.CharField(label='Confirm Password',
                                widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email')

    def clean_password2(self):
        cd = self.cleaned_data
        if cd['password'] != cd['password2']:
            raise forms.ValidationError('Passwords don\'t match.')
        return cd['password2']

class ProfileEditForm(forms.ModelForm):
    GENDER = (
        (1, "남성"),
        (2, "여성"),
    )
    birthday = forms.DateField(widget=extras.SelectDateWidget(years=range(1950, 2017)))
    gender = forms.ChoiceField(choices=GENDER, widget=forms.RadioSelect())
    class Meta:
        model = Profile
        fields = ('photo', 'phone_num', 'nationality')

register.html:

{% extends 'base.html' %}
{% load widget_tweaks %}

{% block title %}
회원가입
{% endblock %}

{% block content %}

    <div class="user-regist">
 <div class="user-regist-header">회원가입</div>

 <form action="." method="post">
     <div class="user-profile-img">
{#         {%  render_field profile_form.photo %}#}
     </div>
     {% render_field user_form.last_name placeholder="성 (Last Name)" %}<br>
{% render_field user_form.first_name placeholder="이름 (First Name)" %}<br>
{% render_field profile_form.gender %}<br>

{% render_field user_form.email placeholder="이메일*" %}<br>
     <p>이메일을 입력해주세요.</p>
{% render_field user_form.password placeholder="비밀번호*" %}<br>
{% render_field user_form.password2 placeholder="비밀번호 확인*" %}<br>
     <p>6-20자리 영문소문자/숫자/특수문자 포함</p>

{% render_field profile_form.birthday placeholder="비밀번호 확인*" %}<br>
{% render_field profile_form.nationality placeholder="국적" %}<br>

     {% csrf_token %}
     <p><input type="submit" value="가입하기"/></p>
 </form>
    </div>
{% endblock %}

views.py :

def register(request):
    if request.method == 'POST':
        user_form = UserRegistrationForm(request.POST)
        profile_form = ProfileEditForm(request.POST)
        if user_form.is_valid() and profile_form.is_valid():
            profile_form.save()
            new_user = user_form.save(commit=False)
            new_user.set_password(user_form.cleaned_data['password'])
            new_user.save()
            this_user = authenticate(username=user_form.cleaned_data['username'],
                                     password=user_form.cleaned_data['password'],
                                     )
            login(request, this_user)
            return render(request, 'views/register_done.html', {'new_user': new_user})
    else:
        user_form = UserRegistrationForm()
        profile_form = ProfileEditForm()
    return render(request, 'views/register.html', {'user_form': user_form,
                                                   'profile_form': profile_form})
U-lis commented 7 years ago

확인해보니 여기 가 문제네요. profile_form.is_valid() 를 출력하면 False가 나옵니다.

일단 request.POST에서는 값을 확인할 수 있으나 이게 form에 제대로 연결이 되지 않는지 아니면 모델이랑 엮는게 문제인지 profile_form 안에는 nationality, gender, birthday 이런 속성이 존재하지 않는다고 나옵니다.

이쪽을 확인해 고치면 될 것 같네요.

그리고 아무 에러도 찾지 못한 것은 44번 줄에 있는 if에 대한 else 구문을 설정에 예외상황을 처리하지 않았기 떄문입니다. 이런 검증은 통과하지 못하는 경우에 대한 루틴을 항상 생각해놓아야 합니다.