본문 바로가기

Pyhon/Django

[Pyhon/Django] 장고 기초#016. 장고 폼 수정(Edit)하기

장고 폼 수정하기

지금까지 작업 내용으로는 포스트 타이틀을 클릭하면 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 })

이제 웹 사이트에 접속하여 기존 포스트를 수정 할 수 있습니다.