[Django] 게시판 만들기 (4) - register view & template

마이구미·2021년 12월 7일
0

Django

목록 보기
4/4
post-thumbnail

register

register.html

현재 view.py에 register 메소드로 등록을 처리하려고 한다. 이를 위해서 html form이 필요하고 실제로 데이터를 저장하는 과정도 필요하다. 먼저 간단하게 html파일을 수정해보았다.

<h1>register</h1>

<form method="POST" action="{% url 'user:register' %}">
    {% csrf_token %}
    <div class="form-group">
        <label for="userid">ID</label>
        <input type="text" class="form-control" id="userid" name="userid" required />
    </div>
    <div class="form-group">
        <label for="email">Email address</label>
        <input type="email" class="form-control" id="email" name="email" required />
    </div>
    <div class="form-group">
        <label for="password">Password</label>
        <input type="password" class="form-control" id="password" name="password" required />
    </div>
    <div class="form-group">
        <label for="re_password">Re-Password</label>
        <input type="password" class="form-control" id="re_password" name="re_password" required />
    </div>
    <input type="submit" />
    <div class="row mt-5">
        <div class="col-12">{{error}}</div>
    </div>
</form>

회원가입 정보를 처리하기 위해서 post method를 사용하고 user:register 는 경로를 하드코딩하지 않기 위한 방법이다. 여기서 user는 app_name으로 프로젝트에 여러 앱이 존재할 수 있기 때문에 앱들을 구분짓기 위한 namespace다. register는 urls.py의 path()에서 설정한 name argument로 이를 사용하여 url에 대한 의존성을 낮출 수 있다. 이 내용들은 아래에서 확인할 수 있다.

https://docs.djangoproject.com/en/3.2/intro/tutorial03/

views.py/register

템플릿을 작성했으니 view도 작성해야 한다. 먼저 주소를 치고 들어오는 경우 작성해둔 register.html이 보여준다. 이를 위해 method로 구분지어 처리했다. post로 오는 경우는 등록하려고 폼을 입력하고 제출한 것으로 여기서는 입력한 값을 받아 비밀번호가 일치하는지 확인하고 일치하지 않으면 에러문구를 띄워주고 다시 입력을 받고, 일치한다면 새로운 모델로 저장하고 로그인 페이지로 리다이렉트 해준다.

def register(request):
    if request.method == 'GET':
        return render(request, 'user/register.html')
    elif request.method == 'POST':
        user_id = request.POST['userid']
        email = request.POST['email']
        password = request.POST['password']
        re_password = request.POST['re_password']

        # 비밀번호가 일치하지 않으면 
        # 에러문구 출력 후 다시 register로
        if password != re_password:
            data = {'error': '비밀번호가 일치하지 않습니다.'}
            return render(request, 'user/register.html', data)

        user = User(
            user_id = user_id,
            email = email,
            password = password,
        )
        user.save()

		
        return HttpResponseRedirect(reverse('user:login'))

render vs HttpResponseRedirect

사실 위의 register method에서 이 두 개의 코드가 보여주는 결과는 모두 login.html로 동일하다.

return reder(request, 'user/login.html')

return HttpResponseRedirect(reverse('user:login'))

render의 경우 단순히 지정된 html 파일만 보여주는 것이다. 따라서 주소창을 보게 되면 /user/register로 실제 페이지가 이동하지는 않았다는 것을 알 수 있다. 하지만 HttpResponseRedirect의 경우 이름에서도 알 수 있듯이 리다이렉트 하기 때문에 실제 로그인 페이지로 이동하게 된다. 보여지는 결과는 같지만 근본적인 차이가 있다.

reverse()

HttpResponseRedirect 안에서 reverse()를 사용했는데 이는 url을 하드코딩하지 않게 해주는 함수이다. 따라서 reverse('user:login')을 하게 되면 찾게 되는 url은 /user/login이 된다. 추가로 argument도 사용하여 url을 나타낼 수 있다.

https://docs.djangoproject.com/en/3.2/intro/tutorial04/

admin 수정

register.html을 통해 실제로 새로운 가입자를 만들어 내면 admin 페이지에서 확인할 수 있다.

img

그러나 이 경우 사용자의 이름만이 보일 뿐 이메일, 가입 날짜 등 다른 정보는 보이지 않는다. 이를 보기 위해서 admin.py를 수정해주었다.

# user/admin.py

from django.contrib import admin

from .models import User

class UserAdmin(admin.ModelAdmin):
    list_display = ('user_id', 'email', 'password', 'created_at', 'updated_at')

admin.site.register(User, UserAdmin)    

img

수정 후에는 필요한 정보를 볼 수 있지만 비밀번호가 그대로 노출되는 것이 좋아보이진 않았다. admin 페이지에서만 보이지 않는 것이 아닌 실제로 부호화하여 저장하는 것이 좋다고 생각했다. 이를 위해 모델을 생성하는 부분에 코드를 추가하였다.

from django.contrib.auth.hashers import make_password

...
...

user = User(
	...
        password = make_password(password),
        ...
)

img

수정 후 비밀번호가 부호화된 것을 볼 수 있었다.

profile
마이구미 마시쪙

0개의 댓글