본문 바로가기
수업(국비지원)/Django

[Django] 비밀번호 수정

by byeolsub 2023. 4. 27.

📌 passwordform.html

<!DOCTYPE html>
<html><head><meta charset="UTF-8">
<title>비밀번호수정</title>
{% load static %}
<link rel="stylesheet" href="{% static 'css/main.css' %}">
<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
<script type="text/javascript">
   function inchk(f) {
	   if(f.chgpass.value != f.chgpass2.value) {
		   alert("변경 비밀번호 와 변경 비밀번호 재입력이 다릅니다.");
		   f.chgpass2.value="";
		   f.chgpass2.focus();
		   return false;
	   }
	   return true;
   }
</script></head>
<body>
<form action="../password/" method="post" name="f" onsubmit="return inchk(this)">
{%  csrf_token  %}
<table><caption>비밀번호 변경</caption>
  <tr><th>현재 비밀번호</th><td><input type="password" name="pass"></td></tr>
  <tr><th>변경 비밀번호</th><td><input type="password" name="chgpass"></td></tr>
  <tr><th>변경 비밀번호 재입력</th>
  <td><input type="password" name="chgpass2"></td></tr>
  <tr><td colspan="2"><input type="submit" value="비밀번호 변경"></td></tr>
</table></form></body></html>

📌 passoword.html

<script>
   alert("{{msg}}");
   {% if closer  %}
      opener.location.href="{{url}}";
      self.close();
   {% else %}
      location.href="{{url}}";
   {% endif %}
</script>

 📌 urls.py 내용 추가

# -*- coding: utf-8 -*-
"""
Created on Wed Dec 21 10:19:40 2022

@author: KITCOOP
member/urls.py
"""

from django.urls import path
from . import views
# <http://127.0.0.1:8000/member/>
urlpatterns=[
    #<http://127.0.0.1:8000/member/login/> 요청시 view.py
    #  의 login 함수 실행
    path("login/",views.login, name="login"),
    #<http://127.0.0.1:8000/member/join/>
    path('join/', views.join,name='join'),
    path('main/', views.main, name='main'),
    path('logout/', views.logout, name='logout'),
    path('info/<str:id>/', views.info,name='info'),
    path('update/<str:id>/', views.update,name='update'),
    path('delete/<str:id>/', views.delete,name='delete'),
    path('list/', views.list, name='list'),
    path('picture/', views.picture, name='picture'),
    **path('password/<str:id>/',views.password, name='password')**
]

📌 update.html 수정

{% extends "base1.html" %}
{% block content %}
<script type="text/javascript">
   function  inputcheck(f) {
   if(f.pass.value == "") {
		   alert("비밀번호를 입력하세요");
		   f.pass.focus();
		   return false;
	   }
   }
   function win_passchg() {
	  var op = "width=500, height=250, left=50,top=150";
	  open("../../password/","",op);
   }
   **function win_upload(){
	   var op = "width=500,height=150,left=50, top=150";
	   open("../../picture/","",op);**
   }
</script>

<form action="../../update/{{mem.id}}/" name="f" method="post"  onsubmit="return inputcheck(this)">
{%  csrf_token  %}
<input type="hidden" name="picture" value="{{mem.picture}}">
<table><caption>회원 정보 수정</caption>
<tr><td rowspan="4" valign="bottom">
  <img src="/file/picture/{{mem.picture}}"  width="100" height="120" id="pic"><br>
  <font size="1"><a href="javascript:win_upload()">사진수정</a></font>
</td><th>아이디</th>
<td><input type="text" name="id" readonly value="{{mem.id}}"></td></tr>
<tr><th>비밀번호</th><td><input type="password" name="pass" ></td></tr>
<tr><th>이름</th>
<td><input type="text" name="name" value="{{mem.name}}"></td></tr>
<tr><th>성별</th><td><input type="radio" name="gender" value="1"
     {% if mem.gender == 1 %}
                          checked
      {% endif %}>남
       <input type="radio" name="gender" value="2"
     {% if mem.gender == 2 %}
              checked
     {% endif %}>여</td></tr>
<tr><th>전화번호</th>
<td colspan="2"><input type="text" name="tel" value="{{mem.tel}}"></td></tr>
<tr><th>이메일</th><td colspan="2"><input type="text" name="email"
    value="{{mem.email}}"></td></tr>
<tr><td colspan="3"><input type="submit" value="회원수정">
<input type="button" value="비밀번호수정" onclick="win_passchg()">
</td></tr></table></form>
{% endblock content %}

📌 views.py 내용 추가

from django.shortcuts import render
from .models import Member
from django.http import HttpResponseRedirect
from django.contrib import auth
import time
# member/views.py
#<http://127.0.0.1:8000/member/login/> 요청시 호출되는 함수
def login(request) :
    print("1:",request.session.session_key)
    if request.method != "POST" :
       return render(request,"member/login.html")
    else :
       id1=request.POST["id"] 
       pass1=request.POST["pass"]
       try :
           #입력된 id값으로 Member 객체에서 조회
           member = Member.objects.get(id=id1) #select 문장 실행
       except :  #db에 아이디 정보가 없을 때
           context = {"msg":"아이디를 확인하세요."}
           return render(request,"member/login.html",context)
       else :  #정상적인 경우. 아이디 정보가 조회된 경우
           #member.pass1 : db에 등록된 비밀번호
           #pass1 : 입력된 비밀번호
           if member.pass1 == pass1 :  #로그인 정상
              time.sleep(1)
              print("2:",request.session.session_key)
              request.session["login"] = id1  #session 객체에 login 등록.
              return HttpResponseRedirect("../main")
           else :  #비밀번호 오류
               context = {"msg":"비밀번호가 틀립니다.","url":"../login/"}
               return render(request,"alert.html",context)
               

def join(request) :
    if request.method != "POST" :
       return render(request,"member/join.html")
    else : #POST 방식. 
       #request.POST["id"] : id 파라미터 값.
       member = Member(id=request.POST["id"],\\
                    pass1=request.POST["pass"],\\
                    name=request.POST["name"],
                    gender=request.POST["gender"],
                    tel=request.POST["tel"],
                    email=request.POST["email"],
                    picture=request.POST["picture"]) 
       member.save() #insert 문장 실행.
       return HttpResponseRedirect("../login/")

def main(request):
   print("3",request.session.session_key)
   return render(request, 'member/main.html')

def logout(request) :
    print(request.session.session_key)
    auth.logout(request) #세션종료
    return HttpResponseRedirect("../login/")
    
# urls.py : info/<std:id>/ => info요청 url에서 id 값을 id
#                             매개변수로 전달 
def info(request,id) :
    try :
      login = request.session["login"]
    except : #로그아웃상태
      context = {"msg":"로그인하세요","url":"../../login"}
      return render(request,"alert.html",context)
    else : #로그인 상태
      if login == id or login == 'admin' :
          member = Member.objects.get(id=id)
          return render(request,"member/info.html",{"mem":member})
      else :
        context = {"msg":"본인만 가능합니다.","url":"../../main"}
        return render(request,"alert.html",context)
    
def update(request,id) :
    try :
      login = request.session["login"]
    except : #로그아웃상태
      context = {"msg":"로그인하세요","url":"../../login"}
      return render(request,"alert.html",context)
    else : #로그인 상태
      if login == id or login == 'admin' :
         return update_rtn(request,id)
      else :
        context = {"msg":"본인만 가능합니다.","url":"../../main"}
        return render(request,"alert.html",context)
    
def update_rtn(request,id) :
    member = Member.objects.get(id=id)
    if request.method != "POST" :
       return render(request,"member/update.html",{"mem":member})
    else :
       #비밀번호 검증. 
       #비밀번호 오류시 비밀번호 오류 메세지, update.html 페이지 출력
       #member.pass1 : db에 등록된 비밀번호
       # request.POST["pass"] : 입력된 비밀번호
       if request.POST["pass"] == member.pass1: #입력pw와 dbpw가 같다면
          member = Member(id=request.POST["id"],\\
                    pass1=request.POST["pass"],\\
                    name=request.POST["name"],
                    gender=request.POST["gender"],
                    tel=request.POST["tel"],
                    email=request.POST["email"],
                    picture=request.POST["picture"]) 
          #id값존재:update, id값없으면 insert    
          member.save() #update 문장 실행.
          #member.delete() #db에서 삭제
          return HttpResponseRedirect("../../info/"+id+"/")
       else : #같지않다면 오류메세지와 업데이트페이지 출력
        context = {"msg":"비밀번호 오류입니다.",\\
                   "url":"../../update/"+id+"/"}
        return render(request,"alert.html",context)
           
def delete(request,id) :
    try :
        login = request.session["login"]
    except :
      context = {"msg":"로그인하세요","url":"../../login"}
      return render(request,"alert.html",context)
    else :
      if login == id or login == 'admin' :
         return delete_rtn(request,id)
      else :
        context = {"msg":"본인만 가능합니다.",\\
                   "url":"../../main"}
        return render(request,"alert.html",context)

def delete_rtn(request,id) :
   if request.method != "POST" :
      return render(request,"member/delete.html",{"id":id})
   else :
      login = request.session["login"]
      member = Member.objects.get(id=login)       
      if member.pass1 == request.POST["pass"] : #비밀번호 일치
         mem = Member.objects.get(id=id)
         mem.delete()
         if id == login : #본인탈퇴
             auth.logout(request) #로그아웃
             context={"msg":"탈퇴완료","url":"../../login/"}
             return render(request,"alert.html",context)
         else : #관리자 강제탈퇴
             return HttpResponseRedirect("../../list/")
      else :      #비밀번호 불일치    
         context={"msg":"비밀번호 오류",\\
                  "url":"../../delete/"+id+"/"}
         return render(request,"alert.html",context)

def list(request) :
    try :
        login = request.session["login"]
    except :
        context={"msg":"로그인 하세요","url":"../login/"}
        return render(request,"alert.html",context)
    else :
        if login != "admin" :  #request가 else대신.else없지만 request만나면 종료 
           context={"msg":"관리자만 가능합니다","url":"../main/"}
           return render(request,"alert.html",context)
        #mlist 요소: Member 객체 
        mlist = Member.objects.all() #모든데이터 리턴
        return render(request,"member/list.html",{"mlist":mlist})

def picture(request) : 
    if request.method != 'POST':
       return render(request, 'member/pictureform.html')
    else :
        #request.FILES["picture"] : 업로드된 파일 객체
        #fname : 파일이름
       fname = request.FILES["picture"].name
       handle_upload(request.FILES["picture"])
       return render(request,"member/picture.html",{"fname":fname})
'''
  BASE_DIR/file/picture 폴더 생성 : 이미지 업로드 폴더
'''
def handle_upload(f) : # f : 업로드 된 파일(이미지)의 내용
    with open("file/picture/"+f.name,"wb") as dest : #close 생략 가능
        #f.chunks() : 이진파일 읽기.
        for ch in f.chunks() : 
            dest.write(ch)

**def password(request) :
    try : # 로그인 정보 가지고 오기
       login = request.session["login"]
    except :
        context = {"msg":"로그인 하세요.","url":"../login/"}
        return render(request,"alert.html",context)
    if request.method != "POST" :
         return render\\
             (request,"member/passwordform.html")
    else :
         member = Member.objects.get(id=login)
         if member.pass1 == request.POST["pass"] : # 비밀번호 비교
            member.pass1 = request.POST["chgpass"] # 변경할 비밀번호로 비밀번호값 수정
            member.save() # 해당로그인된 정보를 수정
            context = {"msg":"비밀번호 수정 완료",\\
                        "url":"../info/"+login+"/","closer": True}
            return render(request,"member/password.html",context) 
         else : # 비밀번호 오류
            context = {"msg":"비밀번호 오류",\\
                        "url":"../password/"+login+"/","closer": False}
            return render(request,"member/password.html",context)**

  • 결과

'수업(국비지원) > Django' 카테고리의 다른 글

[Django] 게시판 등록  (0) 2023.04.27
[Django] 게시판 생성  (0) 2023.04.27
[Django] 파일 업로드  (0) 2023.04.27
[Django] 회원탈퇴  (0) 2023.04.27
[Django] 회원가입, 로그아웃, 업데이트  (0) 2023.04.27