Django Project - user 관리
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
Django Project - user 관리
dj_user - user 관리용 django app
project tree
dj_user ├── admin.py ├── apps.py ├── forms.py ├── models.py ├── templates │ ├── base.html │ ├── home.html │ ├── login.html │ └── register.html ├── urls.py └── views.py
MTV 패턴
MTV - M : models.py
from django.db import models class Djuser(models.Model): objects = models.Manager() username = models.CharField(max_length = 64, verbose_name = "아이디") useremail = models.EmailField(max_length = 128, verbose_name = "이메일") password = models.CharField(max_length = 64, verbose_name = "비밀번호") registerd_dttm = models.DateTimeField(auto_now_add = True, verbose_name = "등록일시") def __str__(self): return self.username class Meta: db_table = "djuser" verbose_name = "사용자관리" verbose_name_plural = "사용자관리" # EOF
MTV - T : templates
templates/base.html → 웹 페이지 테마는 bootstrap 에서 무료 테마를 가져옴. → base.html 을 기반으로 다른 html 에서 base.html 을 가져다 씀
{% block contents %} {% endblock %}
templates/home.html
{% extends "base.html" %} {% block contents %} 홈페이지 {% if request.session.user %} 로그아웃 {% else %} 로그인 회원가입 {% endif %} {% endblock %}
templates/login.html
{% extends "base.html" %} {% block contents %} 로그인 {{ error }} {% csrf_token %} {% for field in form %} {{ field.label }} {% if field.errors %} {{ field.errors }} {% endif %} {% endfor %} 로그인 {% endblock %}
templates/register.html
{% extends "base.html" %} {% block contents %} 회원가입 {{ error }} {% csrf_token %} 사용자 이름 사용자 이메일 비밀번호 비밀번호 등록 {% endblock %}
MTV - V : views.py
from django.shortcuts import render, redirect from .models import Djuser from django.contrib.auth.hashers import make_password, check_password from .forms import LoginForm def home(request): return render(request, "home.html") def register(request): if request.method == "GET": return render(request, "register.html") elif request.method == 'POST': username = request.POST.get('username', None) useremail = request.POST.get('useremail', None) password = request.POST.get('password', None) re_password = request.POST.get('re-password', None) res_data = {} if not (username and useremail and password and re_password): res_data['error'] = '모든 값을 입력해야합니다.' elif password != re_password: res_data['error'] = '비밀번호가 다릅니다.' # 아이디 중복 체크 구현 필요 else: djuser = Djuser( username = username, useremail = useremail, password = make_password(password) ) djuser.save() return redirect("/home") return render(request, 'register.html', res_data) def login(request): if request.method == "POST": form = LoginForm(request.POST) if form.is_valid(): request.session['user'] = form.user_id return redirect('/home/') else: form = LoginForm() return render(request, 'login.html', {'form': form}) def logout(request): if request.session.get('user'): del(request.session['user']) return redirect('/home/') # EOF
그외
forms.py : login에 사용하는 LoginForm
from django import forms from .models import Djuser from django.contrib.auth.hashers import check_password class LoginForm(forms.Form): username = forms.CharField( error_messages = {'required' : '아이디를 입력해주세요.'}, max_length = 32, label = "사용자이름") password = forms.CharField( error_messages = {'required' : '비밀번호 입력해주세요.'}, widget = forms.PasswordInput, label = "비밀번호") def clean(self): cleaned_data = super().clean() username = cleaned_data.get('username') password = cleaned_data.get('password') if (username and password): try: djuser = Djuser.objects.get(username = username) except Djuser.DoesNotExist: self.add_error('username', '아이디가 없습니다.') return if not check_password(password, djuser.password): self.add_error('password', '비밀번호가 틀렸습니다.') else: self.user_id = djuser.id # EOF
admin.py - admin 페이지에 보여질 항목들
from django.contrib import admin from .models import Djuser class DjuserAdmin(admin.ModelAdmin): list_display = ('username', 'useremail', 'password', 'registerd_dttm') admin.site.register(Djuser, DjuserAdmin)
urls.py - views.py 에서 만든 함수들을 연결할 url
from django.urls import path, include from . import views urlpatterns = [ path('register/', views.register), path('login/', views.login), path('logout/', views.logout) ]
from http://rond-o.tistory.com/47 by ccl(A)
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
댓글
댓글 쓰기