파이썬으로 장고(Django) 공략하기: 입문 강의를 정리한 내용입니다.

게시글 수정

  • update를 하는 view 메소드를 추가한다.
# third/views.py
def update(request):
    if request.method == 'POST' and 'id' in request.POST:
        # 선택한 id에 해당하는 데이터 조회
        item = Restaurant.objects.get(pk=request.POST.get('id'))
        # 폼에서 입력한 데이터를 RestaurantForm으로 담고 수정할 대상을 instance 인자로 넘긴다
        form = RestaurantForm(request.POST, instance=item)
        if form.is_valid():
            item = form.save() # 유효하면 update
    elif request.method == 'GET':
        item = Restaurant.objects.get(pk=request.GET.get('id'))
        form = RestaurantForm(instance=item) # 조회한 데이터를 RestaurantForm으로 담는다.
        return render(request, 'third/update.html', {'form': form})
    return HttpResponseRedirect('/third/list/')
  • url로 접근할 경우 존재하지 않는 id(pk)에 대한 404 처리를 해야 한다.
  • 장고에 내장되어 있는 get_object_or_404를 이용한다.
# third/views.py
from django.shortcuts import render, get_object_or_404

def update(request):
    if request.method == 'POST' and 'id' in request.POST:
        item = get_object_or_404(Restaurant, pk=request.POST.get('id')) # 404 처리
        form = RestaurantForm(request.POST, instance=item)
        if form.is_valid():
            item = form.save()
    elif request.method == 'GET':
        item = get_object_or_404(Restaurant, pk=request.GET.get('id')) # 404 처리
        form = RestaurantForm(instance=item)
        return render(request, 'third/update.html', {'form': form})
    return HttpResponseRedirect('/third/list/')

404처리화면

  • url을 연결한다.
# third/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('list/', views.list, name="list"),
    path('create/', views.create, name="restaurant-create"),
    path('update/', views.update, name="restaurant-update"),
]
  • update 화면을 작성한다.
<!-- third/templates/third/update.html -->
{% extends 'third/base.html' %}
{% load static %}
{% block content %}
<div class="container">
    <form action="{% url 'restaurant-update' %}" method="post">
        {% csrf_token %}
        <input type="hidden" name="id" value="{{ form.instance.id }}">
        <table>
            {{ form.as_table }}
        </table>
        <button type="submit">수정완료</button>
    </form>
</div>
{% endblock %}
  • 마지막으로 리스트에서 수정하기 링크를 연결하면 된다.
<!-- third/templates/third/list.html -->
...
<div class="card-body">
  <h5 class="card-title">{{ item.name }}</h5>
    <h6 class="card-subtitle mb-2 text-muted">{{ item.address }}</h6>
    <p class="card-text">음식점의 설명이 들어갑니다.</p>
    <a href="#" class="card-link">자세히 보기</a>
    <a href="{% url 'restaurant-update' %}?id={{ item.id }}" class="card-link">수정하기</a>
</div>
...