본문 바로가기
관리자

Programming-[Backend]/Django

Django로 Pinterest 따라 만들기-7. Update, DeleteView 구현

728x90
반응형

 

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 따라만들기 : 바닥부터 배포까지-박형석님 인프런 강의

https://www.inflearn.com/course/%EC%9E%A5%EA%B3%A0-%ED%95%80%ED%84%B0%EB%A0%88%EC%8A%A4%ED%8A%B8/dashboard

 

 

728x90
반응형