안녕하세요 이번 포스팅은 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>
서버를 구동시켜 작성 한 내용을 확인 해 주세요.
실행에 성공 한 화면은 아래와 같습니다.
이후 confirm을 눌러 home화면이 나와야 합니다.
'Old Branch' 카테고리의 다른 글
Django - tweetme 소셜서비스 구현해보기 (16) - Bootstrap Media Object 활용 (0) | 2019.11.04 |
---|---|
Django - tweetme 소셜서비스 구현해보기 (15) - Advanced Searching - 검색기능 적용하기 (0) | 2019.11.01 |
Django - tweetme 소셜서비스 구현해보기 (13) - Create Tweet View (0) | 2019.10.30 |
Django - tweetme 소셜서비스 구현해보기 (12) - Model Form & Validation (0) | 2019.10.29 |
Django - tweetme 소셜서비스 구현해보기 (11) - Dynamic URL Routing (0) | 2019.10.28 |