📢 공지사항
home

User 확장과 인증(실습2)

번호
25
비고
19:14
주차
5월 셋째주
확인

회원 가입, 유저 확장 하기

account/view.py 에 다음 코드 추가
def register_view(request): form = UserCreationForm() return render(request, 'signup.html', {'form':form})
Python
복사
account/urls.py 에 다음 코드 추가
path('register/', register_view, name="signup"),
Python
복사
account/templates 에 signup.html 생성, login.html 내용 복붙
다음과 같이 코드 변경
{% extends 'base.html' %} {% block content %} <h1>Sign up!</h1> <form action="" method="post"> {%csrf_token%} {{form.as_p}} <!-- <table> {{form.as_table}} </table> --> <button type="submit"> submit</button> </form> {% endblock %}
HTML
복사
a 태그를 다음 같이 base.html 에 추가
<li class="nav-item"> <a class="nav-link" href="{% url 'signup' %}">SignUp</a> </li>
HTML
복사
runserver 해보면 SignUp 추가된 것 보이고 들어가면 입력 가능
signup.html 의 폼태그 액션에 {% url 'signup' %} 추가
account/view.py 에 다음 코드 추가
def register_view(request): if register_method == "POST": form = UserCreationForm(request.POST) if form.is_valid(): user = form.save() login(request, user) return redirect("home") else: form = UserCreationForm() return render(request, 'signup.html', {'form':form})
Python
복사
login_view 랑 비슷하지만 이게 다름
UserCreationForm 안에 request.POST 만 들어감
blog/view.py 랑 비슷하게 save 하지만 이게 다름
폼안에 적어주는 정보 외에 필요한 정보가 없어서 commit 없어도 됨
user 를 login 시켜줌
runserver 해주고 signup 해보면 위에 아이디 뜸, 로그아웃 하면 없어짐, 로그인 다시 하면 생김
login 상태일 때 login 버튼 안 보이게 해보자
home.html 에서 {% if user.is_authenticated %} 복사하고 base.html 로 가져가서 다음과 같이 변경
{% if user.is_authenticated %} <li class="nav-item"> <a class="nav-link active" aria-current="page" href="{% url 'new' %}">Write</a> </li> <li class="nav-item"> <a class="nav-link" href="{% url 'logout' %}">Logout</a> </li> {% endif %} {% if not user.is_authenticated %} <li class="nav-item"> <a class="nav-link" href="{% url 'login' %}">Login</a> </li> <li class="nav-item"> <a class="nav-link" href="{% url 'signup' %}">SignUp</a> </li> {% endif %}
HTML
복사
runserver 로 확인
account/models.py 에 다음 코드 추가
from django.contrib.auth.models import AbstractUser class CustomUser(AbstractUser): nickname = models.CharField(max_length=100) university = models.CharField(max_length=50) location = models.CharField(max_length=200)
Python
복사
AbstractUser 를 상속하는 것 만으로 바로 대체해서 못 씀
... settings.py 에 인증받을 유저 모델을 해당 모델로 사용하겠다는 세팅 필요
settings.py 에서 ALLOWED_HOSTS = [] 아래에 AUTH_USER_MODEL = 'account.CustomUser' 추가
→ class CustomUser(AbstractUser): 을 migration 해줘야 함
터미널에 python manage.py makemigrations(project2 상태 o) 입력
TypeError: argument of type 'WindowsPath' is not iterable 오류 발생하기도 함
⇒ 가상환경 안 켜서 생기는 에러
→ source myvenv/Scripts/activate 터미널에 입력해서 가상환경 킴(project2 상태 x)
python manage.py migrate 입력
⇒Migration admin.0001_initial is applied before its dependency account.0001_initial on database 'default'. 오류 뜨는 것 해결하려면
settings.py 의 INSTALLED_APPS = [ 에 있는 'django.contrib.admin', 를 주석처리 함
→ project2/urls.py 의 from django.contrib import admin 과 path('admin/', admin.site.urls), 를 주석처리 함
주석처리 하고 난 다음 python manage.py migrate 재입력, 주석 처리 다 품
account 폴더에 forms.py 파일 생성 후 다음 코드 작성
from django.contrib.auth.forms import UserCreationForm from .models import CustomUser class RegisterForm(UserCreationForm): class Meta: model = CustomUser fields = ['username', 'password1', 'password2', 'nickname', 'location', 'university']
Python
복사
폼을 바꾸려면 account/views.py 에 있는 UserCreationForm 을 상속받으면 됨
메타 클래스에 모델을 커스텀유저로 바꿀 것
fields 에는 username, password1, password2, nickname, location, university ... 추가한 3개의 column 도 같이 form 으로 보낼 수 있도록 함
account/views.py 의 register_view 에서 form 을 RegisterForm 으로 바꿈 (둘다)
from 에서 UserCreationForm 없애고 from .forms import RegisterForm 추가
runserver 하면 SignUp 에서 Nickname, Location, University 보임
nickname 설정되었는지 보기
blog/templates/home.html 에서
{% if user.is_authenticated %}
{{user.username}}
{% endif%}
{% if user.is_authenticated %}
{{user.location}}에 사는 {{user.university}} 다니는 {{user.nickname}}님 안녕하세요
{% endif%}
로 바꿈 (템플릿 변수)
superuser 기억 안낭.. 다시 생성 ///////////// 서버 종료하기 ctcl + c
/admin 으로 로그인해서 들어오면 users 사라져 있을 것
→ account/admin.py 에 다음 코드 추가
from .models import CustomUser admin.site.register(CustomUser)
Python
복사
runserver 해서 admin 다시 들어가면 user 볼 수 있음