- 만들어진 로그인 창 하단에 보면 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로 세션 데이터를 전송해줘야한다.
'Study > django' 카테고리의 다른 글
django 기초 - bootstrap을 이용한 사이트 만들기 : 6. 게시판 글 등록 (0) | 2021.08.22 |
---|---|
django 기초 - bootstrap을 이용한 사이트 만들기 : 5. 로그아웃과 로그인세션 (0) | 2021.08.22 |
django 기초 - bootstrap을 이용한 사이트 만들기 : 3. 로그인 페이지 만들기 (0) | 2021.08.19 |
django 기초 - bootstrap을 이용한 사이트 만들기 : 2. Models, Admin Page로 데이터 관리하기 (0) | 2021.08.19 |
django 기초 - bootstrap을 이용한 사이트 만들기 : 1. 페이지 틀 구성하기 (0) | 2021.08.18 |