1. UpdateView
UpdateView 작성
updateView는 createView와 거의 동일하다.
views.py 일부
form_class는 UserCreationView를 그대로 이요하였다.
class AccountUpdateView(UpdateView):
model = User
context_object_name = 'target_user'
form_class = UserCreationForm
success_url = reverse_lazy('accountapp:hello_world')
template_name = 'accountapp/update.html'
update.html
{% url %} 내부에 pk=user.pk로 로그인한 사용자 본인의 정보를 수정할 수 있도록 하였다.
{% extends 'base.html' %}
{% load bootstrap4 %}
{% block content %}
<div style="text-align: center; max-width: 500px; margin: 4rem auto">
<div class="mb-4">
<h4>Change Info</h4>
</div>
<form action="{% url 'accountapp:update' pk=target_user.pk %}" method="post">
{% csrf_token %}
{% bootstrap_form form %}
<input type="submit" class="btn btn-dark rounded-pill col-6 mt-3">
</form>
</div>
{% endblock %}
urls.py 일부
path('update/<int:pk>', AccountUpdateView.as_view(), name='update')
DetailView 수정
detailView에서 updateView에 접근이 가능하도록 DetailView에 updateView의 링크를 추가한다.
detail.html의 일부
{% block content %}
<div style="text-align: center; max-width: 500px; margin: 4rem auto">
<p>
{{ target_user.date_joined }}
</p>
<p>
{{ target_user.username }}
</p>
{% if target_user == user %}
<a href="{% url 'accountapp:update' pk=user.pk %}">
<p>
Change Info
</p>
</a>
{% endif %}
</div>
{% endblock %}
UserCreattionForm 상속받기
그런데, update 페이지에서 ID값 까지 수정이 가능한 상태이다. 사용자의 ID값은 변경되지 않도록 한다. 수정하기 위해서 UserCreationForm을 상속받는 새로운 Form을 만든다.
accountapp/forms.py
UserCreationForm의 생성자를 super()로 생성하고, 새로 생성하는 AccountUpdateForm 클래스(self)의 'username' 필드를 .disabled = True로 변경해주어 update 페이지에서 변경이 안되도록 하였다.
from django.contrib.auth.forms import UserCreationForm
class AccountUpdateForm(UserCreationForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['username'].disabled = True
이렇게 생성한 AccountUpdateForm을 views.py의 update View에서의 form_class 값으로 변경해주면 아래 그림과 같이 username은 수정이 불가하게 된다.
2. DeleteView
DeleteView도 앞선 View들과 거의 비슷하다. 다만 강의에서 여태 다룬 CRUD 관련 view 작성은 아직까지는 위험 요소가 많다. 뒷 부분에서 적절히 수정할 것이다.
views.py 일부
class AccountDeleteView(DeleteView):
model = User
context_object_name = 'target_user'
success_url = reverse_lazy('accountapp:login')
template_name = 'accountapp/delete.html'
delete.html
버튼의 bootstrap class 이름 중, btn-danger는 빨간색의 경고 색깔을 표시해준다. 아래 페이지 화면에서 확인하자.
{% extends 'base.html' %}
{% load bootstrap4 %}
{% block content %}
<div style="text-align: center; max-width: 500px; margin: 4rem auto">
<div class="mb-4">
<h4>Quit</h4>
</div>
<form action="{% url 'accountapp:delete' pk=target_user.pk %}" method="post">
{% csrf_token %}
{% bootstrap_form form %}
<input type="submit" class="btn btn-danger rounded-pill col-6 mt-3">
</form>
</div>
{% endblock %}
urls.py 일부
path('delete/<int:pk>', AccountDeleteView.as_view(), name='delete'),
detail.view 일부
delete 페이지에 접근 가능하도록 detail.html에 링크를 추가해주었다.
{% if target_user == user %}
<a href="{% url 'accountapp:update' pk=target_user.pk %}">
<p>
Change Info
</p>
</a>
<a href="{% url 'accountapp:delete' pk=target_user.pk %}">
<p>
Quit
</p>
</a>
{% endif %}
참조
1. 작정하고 장고! Django로 Pinterest 따라만들기 : 바닥부터 배포까지-박형석님 인프런 강의