티스토리 뷰
Update란, User 프로필 수정하는 것이라고 생각하면 된다. 기본적으로 form을 이용할 것이기 때문에, 기존 앞에서 html의 form과 동일하게 작성해주면 된다. 우리는 여기서 UserChangForm을 사용할 것이다.
게시물 작성에서 create와 update부분이 비슷한 부분이 있어 합쳐서 form.html을 했었다. 그러나 사용자 인증관리에서의 create는 회원가입 부분이기 때문에 create는 password가 2개를 적어야 하고 update부분에서는 password부분을 적는 것이 없기 때문에 같이 쓰는 것이 불가능하다.
2021/01/04 - [Web/Django] - [Django]사용자인증관리_User모델, 비밀번호 암호화
2021/01/05 - [Web/Django] - [Django]사용자인증관리_signup(회원가입)_UserCreationForm
2021/01/06 - [Web/Django] - [Django] 사용자 인증관리_Detail(프로필 보기) get_user_model
이 부분을 들어가기 전에 기본적으로 위의 부분을 보고 오는 것을 추천한다. 전체적인 개념이 적혀있기 때문에 꼭 읽고 와서 이해를 하도록 하자.
기본적으로 User를 변경하기 위한 Form이 있다. 바로 UserChangForm이다. url과 html을 적용을 했다는 전재하에 아래와 같이 적용을 해보자. 아래의 views.py는 수정할 것이기 때문에 눈으로만 확인하자.
# accounts/urls.py
path('<int:pk>/update/', views.update, name='update')
# accounts/views.py
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
def update(request, pk):
form = UserChangeForm()
context={
'form':form
}
return render(request, 'accounts/update.html', context)
대략적으로 이렇게 한 후에 서버를 킨 후에 form을 뽑아서 보니 이름 이메일뿐만 아니라, 등록일, 마지막 로그인, 권한 등이 필요 없는 것들도 수정하라고 뜬다. 그런데 우리는 이것들을 다 쓸 필요가 없다. 따라서 우리는 UserChangeForm에서 필요한 것들만 뽑아서 쓸 것이다.
우리는 앞에서 배운 modelform을 이용할 것이다. 관련 내용은 아래의 url을 보고 오자.
2020/06/22 - [Web/Django] - [django] Form으로 사용자의 입력받기+ModelForm
핵심은 장고의 내부에서 쉽게 쓸 수 있는 UserChangeForm을 쓸 것인데, 다 쓸 필요가 없으니 필요한 것만 뽑아서 쓰는 것이다. 필요한 것을 뽑아쓸 수 있게 만들어 논 것이 바로 forms.py에서 구현하는 내용이다.
forms.py
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserChangeForm
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = get_user_model()
fields = ['username', 'first_name', 'last_name', 'email']
- UserChangeForm을 상속받아 customUserChangeForm 클래스를 만들었다.
- 그리고 Meta로 사용할 모델을 넣고, fields에는 필요한 것만 뽑아서 넣은 것이다.
- get_user_model()은 User를 가지고 있는 함수이다. 우리는 나중에 확장성을 위해 User 대신 get_user_model()을 사용한다.
accounts/urls.py
path('<int:pk>/update/', views.update, name='update')
기본적으로 pk값은 들어가야한다.
views.py
from .forms import CustomUserChangeForm
def update(request, pk):
form = CustomUserChangeForm()
context={
'form':form
}
return render(request, 'accounts/update.html', context)
서버를 켜서 확인해 보면 fields에서 정의한 4개만 화면에 뜨는 것을 확인할 수 있다. 위의 코드는 get방식만 작성한 것이다. 실제 POST로 받아서 저장로직까지 작성하면 아래와 같다.
from .forms import CustomUserChangeForm
def update(request):
if request.method == 'POST':
form = CustomUserChangeForm(request.POST, instance=request.user)
if form.is_valid():
form.save()
return redirect('articles:index')
else:
form = CustomUserChangeForm(instance=request.user)
context = {
'form': form
}
return render(request, 'accounts/update.html', context)
accounts/templates/update.html
# 장고 부트스트랩이 적용된 코드이다.(이전 내용을 참고하자.)
{% extends 'base.html' %}
{% load bootstrap4 %}
{% block body %}
<form action="" method="POST">
{% csrf_token %}
{% bootstrap_form form %}
<button class="btn btn-primary">수정</button>
</form>
{% endblock %}
update로직으로 이동할 수 있도록 detail.html에서 버튼을 만들어 보자.
# accounts/templates/detail.html 추가내용
{% block body %}
<h1>{{ user.pk }} : {{ user.username }}</h1>
{% if request.user == user %}
<a href="{% url 'accounts:update' %}">회원 수정</a>
<form action="{% url 'accounts:delete' %}" method="POST">
{% csrf_token %}
<button class="btn btn-secondary">회원 탈퇴</button>
........
정리
장고 내부에 User 관리를 위한 User class가 있다. User는 username, email 등이 담겨있는 Abstract User의 상속을 받는다. 즉, 핵심은 기능 확장을 위해 class 상속을 많이 쓴다.
다른 방식으로 회원수정이나 회원가입을 커스텀을 하고 싶다면 아래와 같은 방법들을 사용하면 된다.(장고 내부의 클래스를 받아서 필요한 것만 빼서 쓰는 방식들이다.)
1. User를 상속받아 customUser을 쓰면 된다
2. User를 없애고 AbstractUser를 상속받아서 나만의 User 클래스를 만들어서 진행하면 된다.
3. 위에서 쓴 UserChangForm은 너무 많은 정보를 보내니까 상속 받아 직접 정의를 한다.
화원 가입 형식과 비슷하다. 따라서 UserCreationForm과 UserCreationForm을 비교해서 확인하자..
장고 내부의 것들을 쓰는 게 편한 이유는 패스워드 때문이다.
User와 AbstractUser에 관한 공식문서를 정리한 것은 아래의 url을 다시 보고 오자.
2021/01/04 - [Web/Django] - [Django] 사용자 인증관리_User모델, 비밀번호 암호화
다음은 쿠키 세션, 캐쉬 부분에 대해 알아보자.
'Web > Django' 카테고리의 다른 글
[django] DRF Serializer 기초 개념 정리 (0) | 2021.04.13 |
---|---|
[postman] "detail": "CSRF Failed: CSRF token missing or incorrect." 에러 해결하기 (2) | 2021.04.09 |
[Django]장고 회원 프로필 구현하기 (0) | 2021.01.06 |
[Django] 장고 회원가입 구현하기 기초 (31) | 2021.01.05 |
[Django]사용자인증관리_User모델, 비밀번호 암호화 (31) | 2021.01.04 |
- Total
- Today
- Yesterday
- JavaScript
- TensorFlow
- vuejs
- useState
- nodejs
- Queue
- next.config.js
- Deque
- logout
- django
- mongoDB
- DFS
- error:0308010C:digital envelope routines::unsupported
- Vue
- BFS
- typescript
- read_csv
- NextJS
- 자료구조
- 클라우데라
- UserCreationForm
- useHistory 안됨
- pandas
- 자연어처리
- react
- Express
- nextjs autoFocus
- login
- Python
- react autoFocus
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |