본문 바로가기

Study/django

django 기초 - bootstrap을 이용한 사이트 만들기 : 4. 가입 페이지

 - 만들어진 로그인 창 하단에 보면 Register a new membership이 있다. 이것을 활성화 하기 위해선...

   1. login.html 코드에서 문구와 연결될 url을 입력한다.

   2. urls.py 에서 url을 등록한다.

   3. html 에서 데이터를 전송 받을 수 있도록 get | post 방식과 id를 확인한다. 

   4. 페이지에서 전송 받은 데이터를 views에서 처리한다.

      -> DB와 매핑된 class 객체를 생성한다. ( 앞에서 만든 BbsUsers) 

      -> 전송받은 데이터를 생성된 객체에 입력하고 save() 해준다

      # ORM으로 객체와 테이블이 매핑되어 있기 때문에 save() 메서드만으로 데이터베이스의 데이터를 갱신할 수 있다.

 

 - 가입 버튼과 html 연결 ( 위의 1 ~ 2)

# login.html 
# ../join/ -> 가입 버튼을 눌럿을때 join 페이지로 이동
<a href="../join/" class="text-center">Register a new membership</a>

# urls.py
# join/ 페이지로 이동했을때 수행할 함수를 연결
 path('join/', views.join, name='join'),

# views.py
# 가입 페이지로 이동할때는 넘겨줄 데이터 없음
def join(request):
    return render(request, 'bbs/join.html')

로그인 페이지를 연결하면 아래와 같은 창을 확인할 수 있고(좌), 구성하는 태그는 다음과 같다(우)

 

# join.html
# post - 데이터를 전송할 url 입력
<form action="../send_register/" method="post">

# urls.py
# path 추가! 
    path('send_register/', views.send_register, name='send_register'),

# views.py
def send_register(request):
    if request.method =='POST':
        print('---- join post accepted ! --- ')
        user_id = request.POST['id']
        user_pwd = request.POST['pwd']
        user_name = request.POST['name']
        print(' --- user info --- ', user_id, user_pwd, user_name)
        orm_obj = BbsUser(user_id=user_id, user_pwd=user_pwd,user_name=user_name)
        orm_obj.save()
        return render(request, 'login.html')


 - ????????? 하기 싫어졌다.  (위 코드는 수정하고 올린거여서 실행된다)

 - context가 참조되기전에 할당되었다는 뜻으로 넘겨 주지도 않은 데이터를 넘기려다 오류가 발생한것이다.

 - 문제는 프로세스 로직이었다. 기능 몇개 넣지도 않았지만 벌써 뇌에 과부화가 왔다.

 - 문제 코드

# ursl.py
urlpatterns = [
    path('main/', views.index, name='main'),
    path('list/', views.list, name='list'),
    path('login/', views.login, name='login'),
    path('join/', views.join, name='join'),
    path('send_register/', views.send_register, name='send_register'),
]
# view.py
def login(request):
    if request.method == 'POST':
        id = request.POST['id']
        pwd = request.POST['pwd']
        user = BbsUser.objects.get(user_id=id, user_pwd=pwd)
        print('------ user param : ', id)
        context = {}
        if user is not None:
            request.session['user_name'] = user.user_name
            request.session['user_id'] = user.user_id

            context['session_user_name'] = request.session['user_name']
            context['session_user_id'] = request.session['user_id']

    return render(request, 'bbs/home.html', context)

def send_register(request):
    if request.method =='POST':
        print('---- join post accepted ! --- ')
        user_id = request.POST['id']
        user_pwd = request.POST['pwd']
        user_name = request.POST['name']
        print(' --- user info --- ', user_id, user_pwd, user_name)
        orm_obj = BbsUser(user_id=user_id, user_pwd=user_pwd,user_name=user_name)
        orm_obj.save()
        return redirect('login')

 - "login" url이 로그인 페이지 url인줄 알았지만, 로그인 요청 url이었다.

 - 로그인 요청할때는 사용자 id, pwd가 context로 필요하지만 가입할때 해당 데이터를 넘겨 주지도 않으면서 로그인 요청을 해서 오류가 발생했다. -> 네이밍의 중요성....

 - 위 사진의 프로세스 로직에 따라 views의 index함수와 send_register 함수를 다시 작성했다.

 

# views.py
def index(request):
    if request.session.get('user_name'):
        context = {
            'session_user_name' : request.session['user_name'],
            'session_user_id' : request.session['user_id']
        }
        return render(request, 'bbs/home.html', context )
    return render(request, 'bbs/login.html')
    
def send_register(request):
    if request.method =='POST':
        print('---- join post accepted ! --- ')
        user_id = request.POST['id']
        user_pwd = request.POST['pwd']
        user_name = request.POST['name']
        print(' --- user info --- ', user_id, user_pwd, user_name)
        orm_obj = BbsUser(user_id=user_id, user_pwd=user_pwd,user_name=user_name)
        orm_obj.save()
        return redirect('main')

 - views에 정의된 함수들은 url로부터 request를 요청받아 render()로 요청된 html 문서를 반환하였다.

 - 반대로 redirect는 해당 url로 다시 request를 전송한다. 여기서 주의할점은 redirect()의 인자는 url이 아닌 urls에서 정의 된 name 이다. 

 - 따라서 redirect('main')은 urls.py에서 name='main'으로 정의된 함수에 다시 요청을 보내고, 이에 해당하는 함수는 index() 함수이다. 그리고 이에맞춰 index 함수도 수정하였다.

 - index는 'main/' url의 요청에 호출된다. 로그인이 된 사람이면 메인페이지를, 아니면 로그인 페이지를 보여줘야 한다.

 - session에서 유저 정보를 확인하고, 확인이 된다면 'home.html'을 출력하며 session 데이터를 유지시킨다.

 - 확인이 되지 않는다면 'login.html'문서를 출력한다.

 

## index함수에서 context에 session data를 입력하는 이유

 - django만의 단점이다. django에서는 session을 유지하기위해 context로 세션 데이터를 전송해줘야한다.