본문 바로가기
Python/Django Ⅱ

Django 게시물 수정하기

by Mr.DonyStark 2024. 5. 14.

□ 현재까지 등록버튼을 통해 등록페이지로 이동, 입력한 값을 POST 방식으로 DB에 저장되도록 구현하였음.

https://dandora-90.tistory.com/346

 

Django Form 기능 / 게시물 등록하기

□ 앞에서 우리는 admin 페이지에서 게시물을 등록하고 게시된 것을 상세보는 것을 구현했음□ 이번에는 admin이 아닌 사용자가 직접 게시물을 등록하도록 구현하고자함□ 코드  ○ T : Templete(템

dandora-90.tistory.com

□ 이번에는 등록한 글을 수정하는 기능을 구현하고자함

 코드

  ○ V : View(뷰)

    - instance 매개변수는 폼이 수정할 대상 객체(instance)를 지정하는 데 사용

from django.shortcuts import render, get_object_or_404, redirect #get_object_or_404 : 모델로부터 데이터를 찾아보고 만약 찾는 데이터가 없다면 404 에러 반환
from .models import Photo #orm을 활용해 app>photo 의 Photo 값을 호출
from .forms import PhotoForm #post 방식으로 받은 form 호출

#app photo 의 photo_list 함수 정의 
def photo_list(request):
    #app photo > model에서 정의한 클래스를 .object.all()로 모두 가져와 photos에 담음. photos는 템플릿파일에 활용됨.
    photos = Photo.objects.all()
    return render(request, "photo/photo_list.html",{"photos":photos})

#app photo 의 photo_detail 함수 정의
def photo_detail(request,pk):
    photo = get_object_or_404(Photo, pk=pk)
    return render(request,"photo/photo_detail.html", {"photo":photo})

#새글 등록 : post 방식 : 리다이렉트 및 페이지 이동
def photo_post(request):
    if request.method == "POST": #html에서의 form 이 post 방식으로 서버가 요청올 경우
        form = PhotoForm(request.POST) #forms.py에서 지정한 PhotoForm 클래스 가 호출되고 form 변수에 담김
        if form.is_valid(): #.is_valid 유효성 검사 /  폼이 유효하지 않으면 추가적인 작업을 수행하지 않고 사용자에게 오류를 보여줌
            photo=form.save(commit=False) 
            #form.save() 메소드는 폼에서 받은 데이터를 데이터베이스에 저장하는데, commit=False 옵션을 주면 데이터베이스에는 아직 저장하지 않고 메모리에만 객체를 생성
            photo.save()
            return redirect("photo_detail",pk=photo.pk) #데이터를 처리한 후 사용자를 다른 페이지로 리디렉션하는 부분. 여기서는 방금 저장한 사진 데이터의 세부 정보 페이지로 이동하도록 설정
    else:
        form = PhotoForm()
    return render(request, "photo/photo_post.html",{"form":form})

#등록글 수정 :
def photo_edit(request, pk):
    photo = get_object_or_404(Photo, pk=pk)
    if request.method == "POST": #html에서의 form 이 post 방식으로 서버가 요청올 경우
        form = PhotoForm(request.POST, instance=photo) #forms.py에서 지정한 PhotoForm 클래스 가 호출되고, 수정대상이될 인스턴스를 photo로 설정 form 변수에 담김
        if form.is_valid():
            photo = form.save(commit=False)
            photo.save()
            return redirect('photo_detail', pk=photo.pk)
    else:
        form = PhotoForm(instance=photo)
    return render(request, 'photo/photo_post.html', {'form': form})

 

  ○ URL

    - photo_edit 을 통해 photo/<int:pk>/edit 페이지로 이동되며, view에서 정의한 views.photo_edit 함수 호출

from django.urls import path
from . import views

#app photo > view에서 정의한 photo_list 함수 
urlpatterns = [
    #"" 은 settings.py 에서 허용한 주소가 기본으로 들어감
    path("", views.photo_list, name="photo_list"),
    #models pk 정수형으로 들어가야하므로 <int:pk>
    path("photo/<int:pk>/", views.photo_detail, name="photo_detail"), #상세보기
    path("photo/new/", views.photo_post,name="photo_post"), #새글 등록
    path("photo/<int:pk>/edit", views.photo_edit, name="photo_edit"), #수정
]

 

  ○ T : Templete(템플릿)

<html>
  <head>
    <title>Photo App</title>
  </head>
  <body>
    <!--템플릿태그-->
    <a href="/">홈으로 돌아가기</a> <!--메인화면이동-->
    <h1>{{photo.title}}</h1>
    <h3>
      <!-- url 호출시 photo_edit 함수 작동-->
      <a href="{% url "photo_edit" pk=photo.pk %}">수정하기</a>
    </h3>
    <section>
      <div>
        <img src="{{photo.image}}" alt="{{photo.title}}" width="300" />
        <p>{{photo.description}}</p>
        <p>{{photo.author}}, {{photo.price}}</p>
      </div>
    </section>
  </body>
</html>

 

'Python > Django Ⅱ' 카테고리의 다른 글

Todo : Update  (0) 2024.05.15
Todo : Create, Read  (0) 2024.05.15
Django Form 기능 / 게시물 등록하기  (0) 2024.05.14
게시물 상세보기 페이지 구현 + get_object_or_404  (1) 2024.05.14
V : View(뷰)  (0) 2024.05.03