☘️ Login/Logout 구현
- LoginView와 LogoutView 클래스 django.contrib.auth.views에서 가져옵니다.
- urls.py 파일에서 LoginView를 사용하여 로그인 URL을 설정합니다. template_name 매개변수를 통해 로그인에 사용할 템플릿을 지정합니다.
- 마찬가지로 LogoutView를 사용하여 로그아웃 URL을 설정합니다. 별도의 템플릿을 사용하지 않으므로 template_name 매개변수를 생략합니다.
- next 방식을 구현하기 위해 로그인 버튼과 로그아웃 버튼이 있는 HTML 템플릿을 작성합니다. user.is_authenticated 조건문을 사용하여 로그인 상태에 따라 다른 버튼을 보여줍니다. 로그인 버튼의 href 속성에 ?next={{ request.path }}를 추가하여 다시 해당 페이지로 리다이렉트합니다.
- settings.py 파일에서 LOGIN_REDIRECT_URL과 LOGOUT_REDIRECT_URL을 설정하여 로그인 및 로그아웃 후의 리다이렉션 URL을 지정합니다.
from django.contrib.auth.views import LoginView, LogoutView
from django.urls import path, include
from accountapp.views import hello_world, AccountCreateView
app_name = 'accountapp'
urlpatterns = [
path('hello_world/', hello_world, name='hello_world'),
path('login/', LoginView.as_view(template_name='accountapp/login.html'), name='login'),
path('logout/', LogoutView.as_view(), name='logout'),
path('create/', AccountCreateView.as_view(), name='create'),
]
© Login
{% extends 'base.html' %}
{% block content %}
<div style="text-align: center;">
<div>
<h4>Login</h4>
</div>
<div>
<form action="" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" class="btn btn-primary">
</form>
</div>
</div>
{% endblock %}
☘️ DetailView를 이용한 개인 페이지 구현
- DetailView 클래스를 django.views.generic에서 가져옵니다.
- AccountDetailView를 정의하고, model 속성에 User 모델을 지정합니다.
- context_object_name 속성을 사용하여 템플릿에서 사용할 컨텍스트 변수의 이름을 지정합니다. 여기서는 'target_user'로 설정되어 있습니다.
- template_name 속성을 사용하여 템플릿 파일의 경로를 지정합니다. 여기서는 'accountapp/detail.html'로 설정되어 있습니다.
- URL 패턴에 <int:pk>를 사용하여 해당 계정의 고유한 기본 키(primary key)를 받아옵니다. 이를 통해 상세 정보를 조회할 계정을 식별하고, DetailView가 호출될 때 해당 계정 정보를 제공합니다.
- detail.html 템플릿 파일을 작성합니다. 상세 정보를 보여주는 컨텐츠를 구성하며, target_user 컨텍스트 변수를 사용하여 계정의 속성(예: date_joined, username)을 출력합니다.
© View
from django.views.generic import CreateView, DetailView
class AccountDetailView(DetailView):
model = User
context_object_name = 'target_user'
template_name = 'accountapp/detail.html'
© accountapp/urls
from django.contrib.auth.views import LoginView, LogoutView
from django.urls import path, include
from accountapp.views import hello_world, AccountCreateView, AccountDetailView
app_name = 'accountapp'
urlpatterns = [
path('detail/<int:pk>/', AccountDetailView.as_view(), name='detail'),
© Template
{% extends 'base.html' %}
{% block content %}
<div>
<div style="text-align: center; max-width: 500px; margin: 4rem auto;">
<p>
{{target_user.date_joined}}
</p>
<h2 style="font-family: 'NanumSquareB'">
{{target_user.username}}
</h2>
</div>
</div>
{% endblock %}