□ 현재까지 등록버튼을 통해 등록페이지로 이동, 입력한 값을 POST 방식으로 DB에 저장되도록 구현하였음.
https://dandora-90.tistory.com/346
□ 이번에는 등록한 글을 수정하는 기능을 구현하고자함
□ 코드
○ 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 |