Old Branch

Django - tweetme 소셜서비스 구현해보기 (14) - Update & Delete Tweet View (수정 삭제 구현)

woolbro 2019. 10. 31. 01:07
반응형

안녕하세요 이번 포스팅은 Create된 Tweet을 Update ,Delete해주는 기능들을 작성 해 보려고 합니다.

 

Update, Delete기능 모두 비슷한 로직을 가지고 있습니다. 수정, 삭제는 특정 글이 이미 작성되어있어야 하기 때문이죠

 

이번 포스팅의 모든 소스는 Github 저장소에 올라가있습니다

 


1. Update 로직 & Delete 로직

update&Delete 는 글을 작성 한 후 벌어지는 이벤트입니다. 글을 작성 하고 난 후에 해당 글을 수정 해 주는 이벤트입니다.

 

이를 위해 필요한 것은 2가지 작업입니다.

> 글이 작성되어 있어야 한다.

> 글을 작성 한 사람이 수정하려고 하는지 확인해야 한다.

 

이를 위해서  지난 포스팅에서 작성했었던 Mixin.py에 유저를 확인 해 주는 클래스를 작성 해 보도록 하겠습니다.

tweet/mixins.py 

from django.forms.utils import ErrorList
from django import forms


class FormUserNeededMixin(object):
    def form_valid(self, form):
        if self.request.user.is_authenticated:    
            form.instance.user = self.request.user
            return super(FormUserNeededMixin,self).form_valid(form)
        else:
            form._errors[forms.forms.NON_FIELD_ERRORS] = ErrorList(["로그인 해야합니다."])
            return self.form_invalid(form)

class UserOwnerMixin(object):
    def form_valid(self,form):
        if form.instance.user == self.request.user:
            return super(FormUserNeededMixin, self).form_valid(form)
        else :
            form._errors[forms.forms.NON_FIELD_ERRORS] = ErrorList(["로그인 사용자가 작성한 사용자와 다릅니다."])
            return self.form_invalid(form)

FormUserNeededMixin 클래스는 이전 포스팅에서 작성했던 로그인 유저에 관한 클래스입니다.

로그인 한 유저만 글을 작성 할 수 있도록 도와주는 클래스였습니다.

 

아래에 작성한 UserOwnerMixin 클래스는 FormUserNeededMixin을 통해서 로그인이 되어있는지 확인을하고, 확인된 유저가 글 쓴 사용자와 맞는지 확인 해 주는 클래스 입니다.

 

 

2. Update View Class & Setting URL

이제, 위의 mixins.py를 사용한 update 뷰를 만들어 준후에 url을 이어주도록 하겠습니다.

class TweetUpdateView(UserOwnerMixin, UpdateView):
    queryset = Tweet.objects.all()
    form_class = TweetModelForm
    template_name = 'tweets/update_view.html'
    success_url = "/tweet/"

위처럼 작성 해 주겠습니다.

html은 update와 create는 비슷하기 때문에 우선 아래와 같이 작성 해 주고, 포스팅을 마무리하면서 수정 해 보도록 하겠습니다.

tweets/update_view.html

<form class = 'form' method='POST' action=''>
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Update"/>
</form>

 

아래는 urls.py파일입니다. 작성한 update view를 이어주기 위해 서 추가 해 줍니다.

tweet/urls.py

from django.conf.urls import url,include
from django.conf import settings
from .views import *

urlpatterns = [
    url(r'^$', TweetListView.as_view(), name='list'),
    url(r'^create/$', TweetCreateView.as_view(), name='create'),
    url(r'^(?P<pk>\d+)/$', TweetDetailView.as_view(), name='detail'),
    url(r'^(?P<pk>\d+)/update/$', TweetUpdateView.as_view(), name='update')

]

 

이제 서버를 구동시켜서 작성 된 코드를 확인 해 보겠습니다.

 

우선 django admin에서 새로운 사용자를 생성 한 후에 로그인 해주어야 합니다.

 

그리고 처음 super user가 생성 한 Tweet을 수정하도록 접속 한 후에 수정하면, 아래와 같이 화면에 출력 되는 것을 확인 할 수 있습니다.

 

 

3. Template 공통부분

create의 html 코드와 update의 html코드를 비교해서 살펴 보도록 하겠습니다.

<!-- create_view.html -->
<form class = 'form' method='POST' action=''>
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Tweet"/>
</form>


<!-- update_view.html -->
<form class = 'form' method='POST' action=''>
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Update"/>
</form>

위와 아래 두 html 파일은 input 의 value가 다른 것을 제외하면 모든 코드가 같습니다.

 

지금은 조그만 부분만 보기 때문에 수정을 안해주고 한번에 체크 해 주면 되지 않나 하실 수 도 있겠지만 

 

더 많은 파일들을 관리하고 수정하기에 용이하도록 공통화 시켜주도록 하겠습니다.

 

tweets/form.html을 작성하고, 각각의 화면에서 form.html 을 불러 오려고 합니다.

<!-- form.html -->
<form class = 'form' method='POST' action=''>
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="{{ btn_title }}"/>
</form>

form을 작성 한 후에는 아래와 같이 create_view, update_view html 파일을 작성 해 줍니다.

<!-- create_view.html -->
{% include "tweets/form.html" with form=form btn_title='Tweet' %}

<!-- update_view.html -->
{% include "tweets/form.html" with form=form btn_title='Update' %}

각각의 공통된 폼을 가지고 있는 create_view와 update_view는  {% include %} 코드를 통해서 각각의 폼을 불러와 번거로운 작업을 하지 않게 도와줍니다.

 

 

4. Delete

위의 Update를 작성 한 내용들을 활용 해서 Delete 를 작성 해 주도록 하겠습니다.

 

tweet/views.py

from django.urls import reverse_lazy

class TweetDeleteView(LoginRequiredMixin, DeleteView):
    model = Tweet
    success_url = reverse_lazy("home")
    template_name = 'tweets/delete_confirm.html'

 

view를 이어줄 url입니다.

 

tweet/urls.py

from django.conf.urls import url,include
from django.conf import settings
from .views import *

urlpatterns = [
    url(r'^$', TweetListView.as_view(), name='list'),
    url(r'^create/$', TweetCreateView.as_view(), name='create'),
    url(r'^(?P<pk>\d+)/$', TweetDetailView.as_view(), name='detail'),
    url(r'^(?P<pk>\d+)/update/$', TweetUpdateView.as_view(), name='update'),
    url(r'^(?P<pk>\d+)/delete/$', TweetDeleteView.as_view(), name='delete')

]

 

Tweet( 게시글) 삭제 시 확인 해 주는 페이지 입니다.

 

tweets/delete_confirm.html

<form action="" method="post">
    {% csrf_token %}
    <p> Are You Sure want to delete the Tweet "{{ object }}?"</p>
    <input type="submit" value="Confirm"/>
</form>

서버를 구동시켜 작성 한 내용을 확인 해 주세요.

 

실행에 성공 한 화면은 아래와 같습니다.

 

localhost:8000/tweet/10
localhos:8000/tweet/10/delete

 

이후 confirm을 눌러 home화면이 나와야 합니다.