파이썬으로 장고(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/')
- 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>
...