1. 프로젝트 생성
2. 초기 설정, 커스텀 모델, 메인페이지 연결
3. admin 디스플레이 설정과 회원가입, 로그인, 로그아웃 기능
☝🏻 프로젝트 생성
1. 가상환경 새로 만들어주깅
conda create --name <가상환경이름> python=3.8
2. 장고 설치 (pip install django)
3. 프로젝트&앱 생성
django-admin startproject congig .
python manage.py startapp core
☝🏻 초기 설정, 커스텀 모델, 메인페이지 연결
#config/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'core', #추가
]
1. core 커스텀 모델
#core/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser, BaseUserManager
# 일반 유저와 관리자 생성하는 함수
class UserManager(BaseUserManager):
def create_user(self, username, nickname, password=None):
"""
주어진 이름, 닉네임, 비밀번호 등 개인정보로 User 인스턴스 생성
"""
if not username:
raise ValueError(('Users must have an username'))
user = self.model(
username=username,
nickname=nickname,
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, username, password, nickname):
"""
주어진 이름, 닉네임, 비밀번호 등 개인정보로 User 인스턴스 생성
단, 최상위 사용자이므로 권한을 부여한다.
"""
user = self.create_user(
username=username,
password=password,
nickname=nickname,
)
user.is_superuser = True
user.is_admin = True
user.is_staff = True
user.save(using=self._db)
return user
# 유저 필드 함수
class User(AbstractUser):
username = models.CharField(max_length=10, blank=False, null=False, unique=True, verbose_name="회원아이디") # 아이디
nickname = models.CharField(max_length=10, blank=False, null=False, unique=True, verbose_name="닉네임")# 닉네임
name = models.CharField(max_length=10, blank=False, null=False, verbose_name="회원이름") #이름
bio = models.TextField(verbose_name='자기소개') # 바이오
create_at = models.DateTimeField(verbose_name='date joined', auto_now_add=True) # 가입한 날짜
last_login = models.DateTimeField(verbose_name='last login',auto_now=True) # 마지막 로그인
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
# api_key = models.UUIDField(default=uuid.uuid4)
object = UserManager()
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['nickname']
def __str__(self):
return self.username
class Meta:
db_table = 'accounts'
verbose_name = "가입자 목록"
verbose_name_plural = "가입자 목록"
- 정규표현식
core/utils/util.py
import re
def chk_id(id):
result = True
reg = r'^[A-Za-z0-9_]{4,20}$'
if not re.search(reg, id):
# print('아이디는 4~20자의 영문 대문자,소문자, 특수문자 '_', 숫자 사용 가능합니다.')
result = False
return result
def chk_nickname(nickname):
result = True
reg = r'^[A-Za-z가-힣0-9_]{2,12}$'
if not re.search(reg, nickname):
result = False
#print('닉네임은 2자리 이상 12자리 이하이어야 합니다. (특수기호, 공백 사용 불가)')
return result
def chk_password(pwd):
result = True
reg = r'^(?=.*[\d])(?=.*[a-z])(?=.*[!@#$%^&*()])[\w\d!@#$%^&*()]{7,}$'
if not re.search(reg, pwd):
# print('비밀번호를 확인하세요. 최소 1개 이상의 소문자, 숫자, 특수문자로 구성되어야 하며 길이는 7자리 이상이어야 합니다.')
result = False
return result
def chk_name(name):
result = True
reg = r'^[A-Za-z가-힣]{2,10}$'
if not re.search(reg, name):
# print("한글과 영문 대 소문자를 사용하세요. (특수기호, 공백 사용 불가)")
result = False
return result
2. core view
from django.shortcuts import render, redirect
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth import login
from django.contrib.auth.decorators import login_required
# 정규표현식
from core.utils import util as custom_util
#모델 가져오기
from .models import User
# 메안페아자
@csrf_exempt
def main(requset):
return render(requset, 'index.html')
3. core url
urlpatterns = [
path('', views.main, name='main'), # 메인홈
]
#core/urls.py
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('', include('core.urls')), #core urls.py추가
path('admin/', admin.site.urls),
]
☝🏻 admin 디스플레이 설정과 회원가입, 로그인, 로그아웃 기능 구현
- admin
#core/admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
class AccountAdmin(UserAdmin):
# 관리자 페이지
list_display = ('username', 'create_at','last_login','is_admin','is_staff')
search_fields = ('email', 'username')
readonly_fields = ('id','create_at','last_login')
filter_horizontal = ()
list_filter = ()
fieldsets = ()
admin.site.register(User,AccountAdmin)
- 회원가입
#core/views.py
# 가입
@csrf_exempt
def resigter(request):
if request.method == 'POST':
res_data = {}
username = request.POST['username'] # 아이디
nickname = request.POST['nickname'] # 닉네임
name = request.POST['name'] # 이름
password = request.POST['password'] # 1차 비밀번호
re_password = request.POST['re_password'] # 2차 비밀번호
if (username and nickname and name and password == re_password): # 2차 비밀번호까지 같을 때
if custom_util.chk_id(username) and custom_util.chk_nickname(nickname) and custom_util.chk_name(name) and custom_util.chk_password(password):
user_check = User.objects.filter(username=username)
user_nickname_check = User.objects.filter(nickname=nickname)
if user_check: # 회원가 이미 가입되어있음
res_data['error'] = "중복된 아이디 입니다"
elif user_nickname_check:
res_data['error'] = "중복된 닉네임 입니다"
else:
user = User.objects.create_user(
username=username,
nickname=nickname,
name=name,
password=password,
)
login(request, user)
return redirect(main)
elif not custom_util.chk_nickname(nickname):
res_data['error'] = "닉네임은 4~20자의 영문 대문자,소문자, 특수문자 '_', 숫자 사용 가능합니다."
elif not custom_util.chk_id(username):
res_data['error'] = "아이디는 4~20자의 영문 대문자,소문자, 특수문자 '_', 숫자 사용 가능합니다."
elif not custom_util.chk_password(password):
res_data['error'] = "비밀번호를 확인하세요. 최소 1개 이상의 소문자, 숫자, 특수문자로 구성되어야 하며 길이는 7자리 이상이어야 합니다."
elif not custom_util.chk_name(name):
res_data['error'] = "이름은 한글과 영문 대 소문자를 사용하세요. (특수기호, 공백 사용 불가) 이름은 2~12자리"
else:
res_data['error'] = "아이디, 닉네임, 이름, 비밀번호 전부 입력 해주세요"
else:
res_data['error'] = "아이디, 닉네임, 이름, 비밀번호 전부 입력 해주세요"
return render(request, 'resigter.html', res_data)
else:
return render(request, 'resigter.html')
#config/settings.py
...
# 모델을 따로 커스텀 했기에 정의
AUTH_USER_MODEL = 'core.User'
# 로그인 성공 시 자동으로 이동할 URL
LOGIN_REDIRECT_URL = '/'
LOGIN_URL = '/login/'
# 로그아웃 성공 시 자동으로 이동할 URL
LOGOUT_REDIRECT_URL = '/'
중간중간
python manage.py makemigrations
python manage.py migrate
'FrameWork > Django' 카테고리의 다른 글
8월 26일(금) room 추가/수정/삭제 , room 검색, room 상세페이지 (0) | 2022.08.27 |
---|---|
8월 24일(수) 마이페이지(자기소개글 수정하기), Room 앱 생성, Room 모델 (0) | 2022.08.24 |
8월 10일(수) 검색필터 Q (0) | 2022.08.10 |
8월 9일(월) (0) | 2022.08.10 |
8월 5일(금) 마이프로필 수정하기(자기소개) (0) | 2022.08.05 |