Django에서 조회, 등록, 수정, 삭제 기능 구현하기
Django 웹 애플리케이션에서 게시글의 조회, 등록, 수정, 삭제(CRUD) 기능을 구현하는 방법을 다룬다. CRUD 기능은 웹 애플리케이션의 기본 요소로, 사용자가 게시글을 작성하고 관리할 수 있게 한다.
조회 기능은 사용자가 메인 페이지에서 게시글 목록을 볼 수 있도록 한다. index 뷰에서 모든 게시글을 데이터베이스에서 가져와 템플릿에 전달한다.
def index(request):
products = Product.objects.all().order_by('-created_at') # 게시글 목록 조회
context = {
'products': products,
}
return render(request, 'products/index.html', context)
이 코드에서는 모든 게시글을 작성된 순서대로 정렬하여 사용자에게 보여준다.
등록 기능은 사용자가 새로운 게시글을 작성할 수 있게 한다. create 뷰에서는 POST 요청을 통해 전달된 데이터를 저장하고, GET 요청을 통해 게시글 작성 폼을 사용자에게 보여준다.
@login_required
def create(request):
if request.method == 'POST':
form = ProductForm(request.POST, request.FILES)
if form.is_valid():
product = form.save(commit=False)
product.author = request.user
product.save()
return redirect('products:details', product.pk)
else:
form = ProductForm()
context = {
'form': form
}
return render(request, 'products/create.html', context)
이 코드에서는 사용자가 작성한 게시글 데이터를 데이터베이스에 저장하고, 저장이 완료되면 해당 게시글의 상세 페이지로 리다이렉트한다.
수정 기능은 사용자가 기존 게시글을 수정할 수 있게 한다. update 뷰에서는 GET 요청으로 수정 폼을 보여주고, POST 요청으로 수정된 데이터를 저장한다.
@require_http_methods(['GET', 'POST'])
def update(request, pk):
product = get_object_or_404(Product, pk=pk)
if request.user == product.author:
if request.method == 'POST':
form = ProductForm(request.POST, request.FILES, instance=product)
if form.is_valid():
product = form.save()
return redirect("products:details", product.pk)
else:
form = ProductForm(instance=product)
context = {
'product': product,
'form': form,
}
return render(request, 'products/update.html', context)
else:
return redirect('products:details', product.pk)
이 코드에서는 사용자가 게시글의 작성자인 경우에만 게시글을 수정할 수 있도록 하며, 수정이 완료되면 게시글의 상세 페이지로 리다이렉트한다.
삭제 기능은 사용자가 게시글을 삭제할 수 있게 한다. delete 뷰에서는 POST 요청을 받아 게시글을 삭제한다.
@require_POST
def delete(request, pk):
product = get_object_or_404(Product, pk=pk)
if request.user == product.author:
product.delete()
return redirect('index')
else:
return redirect('products:details', product.pk)
이 코드에서는 사용자가 게시글의 작성자인 경우에만 게시글을 삭제할 수 있도록 하며, 삭제가 완료되면 메인 페이지로 리다이렉트한다.