에러

django.utils.datastructures.MultiValueDictKeyError: 'user-password2'

integerJI 2020. 7. 12. 23:29
def signup(request):
    form = UserCreationMultiForm(request.POST, request.FILES)
    if request.method == 'POST':
        if request.POST['user-password1'] == request.POST['user-password2']:
            if form.is_valid(): 
                user = form['user'].save()
                profile = form['profile'].save(commit=False)
                profile.user = user
                profile.email = request.POST['profile-email']
                profile.save()
                print('회원가입성공')
                return redirect('signin')
            else:     
                print('회원가입 실패')
                messages.info(request, '회원가입에 실패했습니다.')
                return render(request, 'signup.html')
        else:
            print('비밀번호가 달라서 실패')
            messages.info(request, '비밀번호가 다릅니다.')
            return render(request, 'signup.html')

    return render(request, 'signup.html', { "form": form })
  <form class="form-signin" method="POST" action="{% url 'signup'%}">
    {%csrf_token%}
    <img class="mb-2" src="{% static 'img/tc-logo.png' %}" alt="" width="100%">
    <div class="hr-sect">Join us</div>
    <br>
    <div class="form-group">
      <label for="formGroupExampleInput">이메일</label>
      <input type="email" name="profile-email" class="form-control" maxlength="50" id="id_profile-email">
    </div>
    <div class="form-group">
      <label for="formGroupExampleInput">비밀번호</label>
      <input type="password" name="user-password1" class="form-control" required id="id_user-password1">
    </div>
    <div class="form-group">
      <label for="formGroupExampleInput">비밀번호 확인</label>
      <input type="password" name="user-password2" class="form-control" required id="id_user-password2">
    </div>
    <div class="form-group">
      <label for="formGroupExampleInput">이름</label>
      <input type="text" name="profile-nick" class="form-control" autofocus required id="id_profile-nick">
    </div>
    <div class="form-group">
      <label for="formGroupExampleInput">생년월일</label>
      <input type="text" name="profile-birth_date" class="form-control" id="id_profile-birth_date">
    </div>
    <button class="btn btn-lg btn-primary btn-block" type="submit">가입하기</button>
  </form>

 

저의 회원가입 로직입니다.

 

user-password1과 user-password2가 같으면 회원가입이 진행이 되는데

 

django.utils.datastructures.MultiValueDictKeyError: 'user-password2'

 

해당 오류가 나왔습니다.

 

해당 오류는 Django에서 제공하는 User모델을 사용할 때 발생합니다.

 

그건 사용할 user-name을 못찾았기 때문입니다.

 

어떠한 유저에 대해 password1과 password2를 넣을 거냐???

 

라는 Django의 User 모델의 대답 때문에 오류가 나는 거였습니다.

 

<input type="text" name="user-username" class="form-control" autofocus required id="id_user-username">

 

해당 user-username을 넣어주면 에러가 안 납니다...

 

저는 email을 받아 email을 username으로 사용해주려 했었는데

 

해당 예외처리를 하지 않아서 발생했으니

 

조심하세요 T-T

 

아래는 아이디 중복체크까지 추가한 수정 버전입니다.

 

저는 models에서 email 컬럼을 아예 삭제했지만

 

아래처럼 view단에서 해결할 수 있습니당

 

def signup(request):
    form = UserCreationMultiForm(request.POST, request.FILES)
    if request.method == 'POST':
        userCheck = request.POST['user-username']
        if request.POST['user-password1'] == request.POST['user-password2']:
            if form.is_valid(): 
                user = form['user'].save()
                profile = form['profile'].save(commit=False)
                profile.user = user
                profile.email = request.POST['user-username']
                profile.save()
                print('회원가입 성공')
                return redirect('signin')
            else:
                if User.objects.get(username=userCheck):
                    print('아이디 중복')
                    messages.info(request, '아이디가 중복됩니다.')
                    return render(request, 'signup.html')        
                print('회원가입 실패')
                messages.info(request, '회원가입에 실패했습니다.')
                return render(request, 'signup.html')
        else:
            print('비밀번호가 달라서 실패')
            messages.info(request, '비밀번호가 다릅니다.')
            return render(request, 'signup.html')

    return render(request, 'signup.html', { "form": form })