장고 폼 수정하기
지금까지 작업 내용으로는 포스트 타이틀을 클릭하면 post_detail.html에서 해당 포스트에 대한 상세 정보를 확인 할 수 있습니다. 이번에는 post_detail.html에서 포스트 내용을 수정하고, 이를 제출하는 작업을 진행 해보겠습니다. 포스트 내용을 수정하는 버튼을 생성하기 위해서 다음 코드를 추가합니다.
<a class="btn btn-default" href="{% url 'post_edit' pk=post.pk %}">
<span class="glyphicon glyphicon-pencil"></span>
</a>
post_detail.html의 최종 시안은 다음과 같습니다. <a> 태그를 추가하여 버튼을 생성하였고, 링크는 장고 템플릿 태그를 사용하여 post_edit 뷰에 연결하도록 하였습니다. 파라미터로 전달되는 pk는 post_detail.html에서 제공되고 있던 포스트의 pk입니다.
{% extends 'blog/base.html' %}
{% block content %}
<div class="post">
{% if post.published_date %}
<div class="date">
{{ post.published_date }}
</div>
{% endif %}
<a class="btn btn-default" href="{% url 'post_edit' pk=post.pk %}">
<span class="glyphicon glyphicon-pencil"></span>
</a>
<h1>{{ post.title }}</h1>
<p>author : {{ post.author }}</p>
<p>created date : {{ post.created_date }}</p>
<p>primary key : {{ post.pk }}</p>
<p>text : {{ post.text|linebreaksbr }}</p>
</div>
{% endblock %}
blog/urls.py에서는 포스트 수정을 위한 url과 뷰를 연결합니다. url에는 수정하려는 포스트의 pk가 포함되며, 해당 url로 요청 시 post_edit 뷰를 호출합니다.
path('post/<int:pk>/edit', views.post_edit, name='post_edit'),
다음으로 blog/views.py에 post_edit 뷰를 추가합니다. 기본적으로 포스트 생성을 위한 post_new 뷰와 비즈니스 로직이 비슷합니다. post_detail.html에서 수정 버튼을 클릭했을 때 열람 중인 포스트를 PostForm에 입력하여 post_edilt.html을 표시합니다. 수정을 완료하고 submit 버튼을 클릭하면 요청(request.POST)에 포함 된 수정 된 포스트 정보를 이용하여 포스트를 저장(commit) 합니다. 포스트를 sumit 하면 post_detail 뷰로 리디렉션 합니다.
def post_edit(request, pk):
post = get_object_or_404(Post, pk=pk)
if "POST" == request.method:
form = PostForm(request.POST, instance=post)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.published_date = timezone.now()
post.save()
return redirect('post_detail', pk=post.pk)
else:
form = PostForm(instance=post)
return render(request, 'blog/post_edit.html', { 'form': form })
이제 웹 사이트에 접속하여 기존 포스트를 수정 할 수 있습니다.
'Pyhon > Django' 카테고리의 다른 글
[Pyhon/Django] 장고 기초#017. 장고 계정 권한 (0) | 2022.01.02 |
---|---|
[Pyhon/Django] 장고 기초#015. 장고 폼 저장(Submit)하기 (0) | 2022.01.02 |
[Pyhon/Django] 장고 기초#014. 장고 폼(ModelForm) (0) | 2022.01.02 |
[Pyhon/Django] 장고 기초#013. 장고 애플리케이션 확장 (0) | 2022.01.02 |
[Pyhon/Django] 장고 기초#012. 장고 템플릿 확장(Template extending) (0) | 2022.01.02 |