
# pragmatic/accountapp/views.py
from django.views.generic import CreateView, DetailView, UpdateView
...
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'
# pragmatic/accountapp/urls.py
from accountapp.views import hello_world, AccountCreateView, AccountDetailView, AccountUpdateView
...
urlpatterns = [
...
path('update/<int:pk>', AccountUpdateView.as_view(), name='update'),
]
pk=user.pk : update 에서는 integer 값이 pk 에 대한 정보를 update.html 에 반영해서 보내주게 된다.detail.html 에서 그 링크를 만들어준다.target_user 라는 것으로 이 페이지 주인의 user 객체를 얻는 데 따라서 if 문으로 target_user 가 지금 접속한 user 와 같은지 비교
<!--pragmatic/accountapp/templates/accountapp/update.html-->
{% extends 'base.html' %}
{% load bootstrap4 %}
{% block content %}
<div style="text-align : center; max-width: 500px; margin: 4rem auto;">>
<div class="mb-4"> <!-- margin bottom 해서 4배 -->
<h4>Chang Info</h4>
</div>
<!--url 일원화, pk=user.pk->pk=target_user.pk 으로 수정 post 방식 으로 전송 -->
<form action="{% url 'accountapp:update' pk=target_user.pk %}" method="post">
{% csrf_token %} <!-- csrf_token 은 항상 들어 가야 하는 것 -->
{% bootstrap_form form %}
<input type="submit" class="btn btn-dark rounded-pill col-6 mt-3">
</form>
</div>
{% endblock %}
<!--pragmatic/accountapp/templates/accountapp/detail.html-->
{% extends 'base.html'%}
{% block content %}
<div>
<div style="text-align: center; max-width: 500px; margin: 4rem auto;">
<p>
{{ user.date_joined }}
</p>
<h2 style="font-family: 'NanumSquareB'">
{{ user.username }}
</h2>
<!-- 추가한 부분 -->
{% if target_user == user %}
<a href="{% url 'accountapp:update' pk=user.pk%}">
<p>
Change Info
</p>
</a>
{% endif %}
</div>
</div>
{% endblock %}
Change Info 링크가 생성되었다

링크 클릭시 계정 생성 페이지가 나왔다

form_class = UserCreationForm 을 사용했었는데, 이 form 을 상속 받아서 약간의 customize 를 할 것이다.UserCreationForm 를 상속받아 AccountUpdateForm 클래스를 다음과 같이 커스터마이즈# pragmatic/accountapp/forms.py
from django.contrib.auth.forms import UserCreationForm
class AccountUpdateForm(UserCreationForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['username'].disabled = True
# 필드로 가지고 있는 값들 중에 username 을 disabled 라는 속성을 활성화
# 만약 바로 위 self.fields 코드가 없다면
# 우리가 import 한 UserCreationForm 과 그걸 상속받은 AccountUpdateForm은 똑겉은 form 이 됨
# 이 한줄이 추가 됨 으로써 초기화 이후에 username 의 칸을 비활성화 시켜줌
# pragmatic/accountapp/views.py
from accountapp.forms import AccountUpdateForm
...
class AccountUpdateView(UpdateView):
model = User
form_class = AccountUpdateForm #UserCreationForm
success_url = reverse_lazy('accountapp:hello_world')
template_name = 'accountapp/update.html'





