728x90
반응형
create랑 유사하다. 우선 create 그대로 가져와서 조금만 수정하는식으로.
views.py
class AccountUpdateView(UpdateView):
model = User
form_class = UserCreationForm
success_url = reverse_lazy('accountapp:hello_world')
template_name = 'accountapp/update.html'
urls.py
from django.contrib.auth.views import LoginView, LogoutView
from django.urls import path
from accountapp.views import hello_world, AccountCreateView, AccountDetailView, AccountUpdateView
app_name = 'accountapp'
urlpatterns = [
path('hello_world/', hello_world, name='hello_world'),
path('login/', LoginView.as_view(template_name='accountapp/login.html'), name='login'),
path('logout/', LogoutView.as_view(), name='logout'),
path('create/', AccountCreateView.as_view(), name='create'),
path('detail/<int:pk>', AccountDetailView.as_view(), name='detail'),
path('update/<int:pk>', AccountUpdateView.as_view(), name='update'),
]
update.html
{% 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=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 %}
이제 자기 페이지를 들어갔을때 페이지주인이 본인 페이지를 수정할 수 있는 페이지로 갈수있는 링크를 만들어야한다.
detail.html
{% extends 'base.html' %}
{% block content %}
<div>
<div style="text-align: center; max-width: 500px; margin: 4rem auto;">
<p>
{{ target_user.date_joined }}
</p>
<h2 style="font-family: 'NanumSquareB'">
{{ target_user.username}}
</h2>
{% if target_user == user %}
<a href="{% url 'accountapp:update' pk=user.pk %}">
<p>
Change Info
</p>
</a>
{% endif %}
</div>
</div>
{% endblock %}
target_user가 user 본인이면 change info 링크띄워준다.
그런데 이제 런서버로 돌려보면 아이디까지 바꿀수 있도록 나타난다. 아이디는 바꿀 수 없게 바꾸자.
accountapp/forms.py를 생성
views.py를 보면 지금까지 UserCreationForm을 제공되는 그대로 썼는데
class AccountUpdateView(UpdateView):
model = User
form_class = UserCreationForm
success_url = reverse_lazy('accountapp:hello_world')
template_name = 'accountapp/update.html'
이걸 상속받아서 수정할것이다.
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 필드를 비활성화시킨다.
views.py에 적용시켜준다.
class AccountUpdateView(UpdateView):
model = User
form_class = AccountUpdateForm
success_url = reverse_lazy('accountapp:hello_world')
template_name = 'accountapp/update.html'
728x90
반응형
'웹 프로그래밍' 카테고리의 다른 글
[pinterest clone (19)] Bug fix (0) | 2021.04.28 |
---|---|
[pinterest clone (18)] DeleteView를 이용한 회원탈퇴 구현 (0) | 2021.04.28 |
[pinterest clone (16)] DetailView를 이용한 개인페이지 구현 (0) | 2021.04.28 |
[pinterest clone (15)] form 디자인 (0) | 2021.04.28 |
[pinterest clone (14)] Login / Logout 구현 (0) | 2021.04.27 |