장고 로그인 기능
Model 테이블 (User model)
모델 필드양식 필드
셋팅
로그인, 로그아웃 관련 지정하는 항목
LOGIN_URL
기본 : '/accounts/login/'
로그인 페이지로 리다이렉트되는 URL
LOGIN_REDIRECT_URL
로그인된 후 리다이렉트
LOGOUT_REDIRECT_URL
로그아웃 이후 지정된 URL로 리다이렉트
settings.py
# LOGIN_URL = '/accounts/login/
LOGIN_REDIRECT_URL = '/'
INSTALLED_APPS = [
...
'widget_tweaks', # 폼 장식
]
URLconf
mysite/urls.py
from mysite.views import UserCreateView, UserCreateDoneTV
urlpatterns = [
...
# 인증 관련 URL 3개 추가, accounts/로 시작하는 것으로 통일
path('accounts/', include('django.contrib.auth.urls')), # 템플릿 URL 패턴에 영향
path('accounts/register/', UserCreateView.as_view(), name='register'),
path('accounts/register/done/', UserCreateDoneTV.as_view(), name='register_done'),
...
]
장고 Auth 앱은 /login/, /logout/ 처럼 URL 정의, 그 앞에 URL 추가 하기 원한다면 표시
View
INSTALLED_APPS = [
# 기본
'django.contrib.admin',
'django.contrib.auth',
LoginView 등은 기본으로 auth 모듈이 등록돼 있어서
장고가 실행될 때 auth 모듈의 view.py 파일에 정의된 뷰가 활성화 된다.
mysite/views.py
# 홈페이지
from django.views.generic import TemplateView
from django.views.generic import CreateView
from django.contrib.auth.forms import UserCreationForm
from django.urls import reverse_lazy # urls.py 모듈이 로딩 될때
class HomeView(TemplateView):
template_name = 'home.html'
# 유저 생성
# /accounts/register/url
class UserCreateView(CreateView):
template_name = 'registration/register.html'
form_class = UserCreationForm # 유저이름 적는 EditText
success_url = reverse_lazy('register_done') # /accounts/register/done URL로 리다이렉트
# /accounts/register/done/url
class UserCreateDoneTV(TemplateView): # URL 처리해주는 뷰, 템플릿만 보여줌
template_name = 'registration/register_done.html' # User 레코드 생성, 가입 처리 후 보여줄 템플릿 파일 명
CreateView
제네릭 에디팅 뷰(편집용 제네릭 뷰)중 하나
테이블에 새로운 레코드를 생성하기 위해 필요한 폼
폼에 입력된 데이터로 테이블의 레코드를 생성해주는 뷰
이외에도 FormView, UpdateView, DeleteView
Form
form_class = UserCreationForm
A ModelForm for creating a new user.
It has three fields: username (from the user model), password1, and password2. It verifies that password1 and password2 match, validates the password using validate_password(), and sets the user’s password using set_password().
https://docs.djangoproject.com/en/4.0/topics/auth/default/
장고의 기본 Form
{{ form.as_p }} : https://opentutorials.org/module/4034/24651
reverse_lazy
success_url = reverse_lazy('register_done') # /accounts/register/done URL로 리다이렉트
폼에 입력된 내용에 에러가 없고 , 테이블 레코드 생성이 완료된 후에 이동할 URL 지정
Template
templates/base.html
<!-- 로그인 form 영역 -->
<form class="form-inline my-2" action="" method="post" role="search">
{% csrf_token %}
<input class="form-control mr-sm-2" type="search" placeholder="global search" name="search_word">
</form>
<ul class="navbar-nav ml-5 mr-5">
<li class="nav-item dropdown mx-1 btn btn-primary">
{% if user.is_active %}
<a class="nav-link dropdown-toggle text-white" href="#" data-toggle="dropdown">
<i class="fas fa-user"></i> {% firstof user.get_short_name user.get_username %} 
</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="{% url 'logout' %}">Logout</a>
<a class="dropdown-item" href="{% url 'password_change' %}">Change</a>
</div>
{% else %}
<a class="nav-link dropdown-toggle text-white" href="#" data-toggle="dropdown">
<i class="fas fa-user"></i> 익명 
</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="{% url 'login' %}">Login</a>
<a class="dropdown-item" href="{% url 'register' %}">Register</a>
</div>
{% endif %}
</li>
</ul>
※ User 객체
user 객체는 장고의 기본 템플릿 변수 이므로, 모든 템플릿 파일 사용 가능
{% if user.is_active %}
is_active
Boolean. Designates whether this user account should be considered active. We recommend that you set this flag to False instead of deleting accounts; that way, if your applications have any foreign keys to users, the foreign keys won’t break.
<i class="fas fa-user"></i> {% firstof user.get_short_name user.get_username %}
{% firstof x y %} : 다음 오는 인자들 중에서 False가 아닌 첫 인자를 선택
user.get_short_name : User 객체의 first_name
user.get_username : User 객체의 username
{% url 'logout' %} : 장고 기본 url , /accounts/login/
기본 제공
templates/registration/login.html
{% extends "base.html" %}
{% load widget_tweaks %}
{% block title %}login.html{% endblock %}
{% block content %}
<h1>Please Login</h1>
<p class="font-italic">Please enter your id and password.</p>
{% if form.error %}
<div class="alert alert-danger">
<div class="font-weight-bold">모두 작성해 주세요</div>
{{ form.errors }}
</div>
{% endif %}
<form action="." method="post" class="card pt-3">{% csrf_token %}
<div class="form-group row">
<!-- widget_tweaks 라이브러리에서 제공하는 add_label_class 필터를 통해 <label> 태그에 부트스트랩 적용 -->
{{ form.username|add_label_class:"col-form-label col-sm-2 ml-3 font-weight-bold" }}
<div class="col-sm-5">
{{ form.username|add_class:"form-control"|attr:"autofocus" }}
</div>
</div>
<div class="form-group row">
{{ form.password|add_label_class:"col-form-label col-sm-2 ml-3 font-weight-bold" }}
<div class="col-sm-5">
{{ form.password|add_class:"form-control" }}
</div>
</div>
<div class="form-group">
<div class="offset-sm-2 col-sm-5">
<input type="submit" value="Log in" class="btn btn-info"/>
<input type="hidden" name="next" value="{{ next }}"/>
<!-- 폼 제출시 폼의 next 변수값을 할당, next : LoginView 뷰에서 넘겨줌, /accounts/login/?next=/post/3/
없으면 settings.LOGIN_REDIRECT_URL 항목에 지정된 URL 사용 : /accounts/profile/URL
-->
</div>
</div>
</form>
{% endblock %}
AuthenticationForm
<!-- widget_tweaks 라이브러리에서 제공하는 add_label_class 필터를 통해 <label> 태그에 부트스트랩 적용 -->
{{ form.username|add_label_class:"col-form-label col-sm-2 ml-3 font-weight-bold" }}
form 변수는 LoginView 뷰에서 넘겨주는 AuthenticationForm 객체
로그인용 기본 폼
class AuthenticationForm¶
A form for logging a user in.
Takes request as its first positional argument, which is stored on the form instance for use by sub-classes.
직접 개발
templates/registration/register.html
{% extends "base.html" %}
{% load widget_tweaks %}
{% block title %}register.html{% endblock %}
{% block content %}
<h1>New User Registration</h1>
<p class="font-italic">Please enter your username and password twice.</p>
{% if from.errors %}
<div class="alert alert-danger">
<div class="font-weight-bold">Please correct the error(s) below.</div>
{{ form.errors }}
</div>
{% endif %}
<form action="." method="post" class="card pt-3">{% csrf_token %}
<div class="form-group row">
{{ form.username|add_label_class:"col-form-label col-sm-3 ml-3 font-weight-bold" }}
<div class="col-sm-5">
{{ form.username|add_class:"form-control"|attr:"autofocus" }}
</div>
</div>
<div class="form-group row">
{{ form.password1|add_label_class:"col-form-label col-sm-3 ml-3 font-weight-bold" }}
<div class="col-sm-5">
{{ form.password1|add_class:"form-control" }}
</div>
</div>
<!-- 비빌 번호 확인 -->
<div class="form-group row">
{{ form.password2|add_label_class:"col-form-label col-sm-3 ml-3 font-weight-bold" }}
<div class="col-sm-5">
{{ form.password2|add_class:"form-control" }}
</div>
</div>
<div class="form-group">
<div class="offest-sm-3 col-sm-5">
<input type="submit" value="Register" class="btn btn-info"/>
</div>
</div>
</form>
{% endblock %}
CreateView 를 사용
class UserCreateView(CreateView):
사용자 계정을 생성하기 위해 비밀번호를 두 번 입력할 수 있도록 password1 , password2 요소 있다.
{{ form.username|add_label_class:"col-form-label col-sm-3 ml-3 font-weight-bold" }}
{{ form.password1|add_label_class:"col-form-label col-sm-3 ml-3 font-weight-bold" }}
{{ form.password2|add_label_class:"col-form-label col-sm-3 ml-3 font-weight-bold" }}
직접 개발
templates/registration/register_done.html
{% extends "base.html" %}
{% block title %}password_change_done{% endblock %}
{% block content %}
<!-- auth.views.PasswordChangeDoneView 뷰에서 "Password change successful"이라는 문장으로 지정 -->
<h1>{{ title }}</h1>
<br>
<p>패스워드 변경 완료 !</p>
{% endblock %}
기본 제공
templates/registration/password_change_form.html
{% extends "base.html" %}
{% load widget_tweaks %}
{% block title %}password_change_form.html{% endblock %}
{% block content %}
<h1>{{ title }}</h1>
<p class="font-italic">패스워드 변경</p>
{% if form.errors %}
<div class="alert alert-danger">
<div class="font-weight-bold">에러 수정해 주세요</div>
{{ form.errors }}
</div>
{% endif %}
<form action="." method="post" class="card pt-3">{% csrf_token %}
<div class="form-group row">
{{ form.old_password|add_label_class:"col-form-label col-sm-3 ml-3 font-weight-bold" }}
<div class="col-sm-5">
{{ form.old_password|add_class:"form-control"|attr:"autofocus" }}
</div>
</div>
<div class="form-group row">
{{ form.new_password1|add_label_class:"col-form-label col-sm-3 ml-3 font-weight-bold" }}
<div class="col-sm-5">
{{ form.new_password1|add_class:"form-control" }}
</div>
</div>
<div class="form-group row">
{{ form.new_password2|add_label_class:"col-form-label col-sm-3 ml-3 font-weight-bold" }}
<div class="col-sm-5">
{{ form.new_password2|add_class:"form-control" }}
</div>
</div>
<!-- 변경 버튼 -->
<div class="form-group">
<div class="offset-sm-3 col-sm-5">
<input type="submit" value="Password change" class="btn btn-info"/>
</div>
</div>
</form>
{% endblock %}
기본제공
templates/registration/password_change_done.html
{% extends "base.html" %}
{% block title %}password_change_done{% endblock %}
{% block content %}
<!-- auth.views.PasswordChangeDoneView 뷰에서 "Password change successful"이라는 문장으로 지정 -->
<h1>{{ title }}</h1>
<br>
<p>패스워드 변경 완료 !</p>
{% endblock %}
templates/registration/logged_out.html
{% extends "base.html" %}
{% block title %}logged_out.html{% endblock %}
{% block content %}
<h1>Logged out</h1>
<br>
<div>
<i class="fas fa-quote-left"></i>
<span class="h6"> Thanks for spending your quality time with this web site today. </span>
<i class="fas fa-quote-right"></i>
</div>
<p class="font-italic"><a href="{% url 'login' %}">Log in again</a></p>
{% endblock %}
'Language > 파이썬' 카테고리의 다른 글
장고(django) 앨범, 사진 조회 기능 - 파이썬 장고를 활용한 쉽고 빠른 웹 개발 프로그래밍 (0) | 2022.01.29 |
---|---|
장고(django) 블로그 글 검색(Search) - 파이썬 장고를 활용한 쉽고 빠른 웹 개발 프로그래밍 (0) | 2022.01.23 |
장고(django) 태그 taggit - 파이썬 장고를 활용한 쉽고 빠른 웹 개발 프로그래밍 (0) | 2022.01.17 |
장고(django) 프로젝트 첫 페이지, 템플릿 상속 - 파이썬 장고를 활용한 쉽고 빠른 웹 개발 프로그래밍 (0) | 2022.01.11 |
장고(django)blog app(+아카이브) - 파이썬 장고를 활용한 쉽고 빠른 웹 개발 프로그래밍 (0) | 2022.01.05 |
댓글