웹 프로그래밍

[pinterest clone (17)] UpdateView를 이용한 비밀번호 변경 구현

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
반응형