회원 가입, 유저 확장 하기
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 랑 비슷하지만 이게 다름
•
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 에서 ALLOWED_HOSTS = [] 아래에 AUTH_USER_MODEL = 'account.CustomUser' 추가
→ class CustomUser(AbstractUser): 을 migration 해줘야 함
TypeError: argument of type 'WindowsPath' is not iterable 오류 발생하기도 함
⇒ 가상환경 안 켜서 생기는 에러
→ source myvenv/Scripts/activate 터미널에 입력해서 가상환경 킴(project2 상태 x)
⇒Migration admin.0001_initial is applied before its dependency account.0001_initial on database 'default'. 오류 뜨는 것 해결하려면
→ project2/urls.py 의 from django.contrib import admin 과 path('admin/', admin.site.urls), 를 주석처리 함
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 볼 수 있음