Django(장고)를 이용한 커뮤니티 만들기4 [템플릿(Template)과 뷰(view)를 이용한 회원가입 기능 구현]
Django
Posted by kwon on
2019-09-06
저번 포스팅에서는 Django의 관리자도구를 사용하는 방법을 알아보았습니다.
이번 포스팅에서는 템플릿(Template)과 뷰(view)를 활용하여 회원가입 기능을 구현해보도록 하겠습니다.
먼저 템플릿에대해 간단히 알아보고 들어가겠습니다.
템플릿(Template) 은 View로부터 전달된 데이타를 템플릿에 적용하여 Dynamic 한 웹페이지를 만드는데 사용됩니다.
Template은 HTML 파일로서 Django App 폴더 밑에 “templates” 라는 서브폴더를 만들고 그 안에 템플릿 파일(.html)을 생성하여 사용합니다. 이는 단일 App이거나 동일 템플릿명이 없는 경우 사용할 수 있습니다.
하지만, Django 개발 가이드라인은 “App폴더/templates/App명/템플릿파일” 처럼, 각 App 폴더 밑에 templates 서브폴더를 만들고 다시 그 안에 App명을 사용하여 서브폴더를 만든 후 템플릿 파일을 그 안에 넣기를 권장하고 있습니다 (예: /home/templates/home/index.html ).
이는 만약 복수의 App들이 동일한 이름의 템플릿을 가진 경우, View에서 잘못된 템플릿을 가져올 수 있기 때문인데, 예를 들어, App1에 create.html이 있고, App2에 동일한 create.html 템플릿이 있는 경우, App2의 View에서 create.html를 지정하면, 처음 App1의 create.html을 사용하게 됩니다. 이는 템플릿을 찾을 때 자신의 App 내의 템플릿을 먼저 찾는 것이 아니라, 전체 App들의 템플릿 폴더들을 처음부터 순서대로 찾기 때문입니다. View에서 “App2/create.html” 과 같이 템플릿명을 지정하면 이런 혼동은 없어지게 됩니다.
따라서 먼저 이전에 만들어두었던 user의 templates폴더 아래에 user이라는 이름의 폴더를 하나 더 생성하고 그 안에 register.html이라는 html5파일을 하나 생성해보도록 하겠습니다.
프로젝트 url의 ‘user/‘ 를 include(‘user.urls’)에 매핑 하게 되고 user.urls를 따라가면 path(‘register/‘, views.register)가 있으므로 register은 views.register함수에 연결되어 127.0.0.1:8000/user/register 라고 입력해주게 되면 templates/user에 작성한 register.html파일에 접근하게 됩니다.
여기까지 완료되었다면 이제 python manage.py runserver 명령어를 통해 서버를 실행시킨 이후에 127.0.0.1:8000/user/register 로 접속하여 확인해보도록 합니다.
위와 같은 화면이 나왔다면 이제 회원정보를 입력받으면 데이터베이스에 정보가 입력되도록 하기 위해서 views.py로 이동하여 코드를 작성해보겠습니다.
이 때, view.py에서 url을 입력하여 페이지를 불러오는 경우(GET방식)와 페이지에서 등록버튼을 누름으로써 페이지에 접근하는 경우(POST방식)를 구분해주어야 합니다. POST의 경우 데이터가 들어왔을 때 처리를 해주어야 함.
from django.shortcuts import render from .models import User from django.http import HttpResponse from django.contrib.auth.hashers import make_password
defregister(request): if request.method == 'GET': return render(request, 'user/register.html') elif request.method == 'POST': username = request.POST.get('username', None) # 템플릿에서 입력한 name필드에 있는 값을 키값으로 받아옴 password = request.POST.get('password', None) # 받아온 키값에 값이 없는경우 None값으로 기본값으로 지정 re_password = request.POST.get('re-password', None)
res_data = {} # 응답 메세지를 담을 변수(딕셔너리)
ifnot (username and password and re_password): res_data['error'] = '모든 값을 입력해야 합니다.' elif password != re_password: res_data['error'] = '비밀번호가 다릅니다.' else: user = User( # 모델에서 생성한 클래스를 가져와 객체를 생성 username=username, password=make_password(password) # 비밀번호를 암호화하여 저장 )