Redirect
지정한 URL로 되돌리는 것을 말하며, 웹 사이트를 이용하면서 많이 봐왔던 동작 방식이다.
글을 작성하고 렌더링을 해준다고 해도 html만 다른 템플릿으로 렌더링을 하고 실제 URL은 이동해서 GET 요청을 보내는 것이 아니기 때문에 POST 요청을 서버에서 처리하고 서버에서는 다른 주소로 Redirect하도록 응답해야 한다.
# articles앱의 views.py
from django.shortcuts import render, redirect
def create(request):
title = request.POST.get("title")
content = request.POST.get("content")
article = Article(title=title, content=content)
article.save()
return redirect("articles")
Delete
게시글 삭제를 구현하기 위해선 어떤 점들이 필요할까?
글 삭제 로직을 진행하는 URL을 만들고 글을 삭제하는 View를 만들어야 한다.
View에서는 삭제하고자 하는 글을 가져오고, 글을 삭제한 다음에 이동할 곳으로 redirect를 걸어준다.
# urls.py
path("<int:pk>/delete/", views.delete, name="delete"),
# views.py
def delete(request, pk):
article = Article.objects.get(pk=pk)
if request.method == "POST":
article.delete()
return redirect("articles")
return redirect("article_detail", article.pk)
method가 POST 일때만 delete를 해주는 이유는 누군가가 URL로 접근했을 때 데이터가 삭제되는 것을 막기 위함이다.
{% extends "base.html" %}
{% block content %}
<h2>글 상세 페이지</h2>
<p>제목: {{ article.title }}</p>
<p>내용: {{ article.content }}</p>
<p>작성일시: {{ article.created_at }}</p>
<p>수정일시: {{ article.updated_at }}</p>
<a href="{% url 'articles' %}"><button>목록 보기</button></a>
<hr>
<form action="{% url 'delete' article.pk %}" method="POST">
{% csrf_token %}
<input type="submit" value="글삭제">
</form>
{% endblock content %}
상세 페이지에서 삭제하는 form을 넣어주었는데 삭제는 데이터베이스에 변경을 일으키기 때문에 POST요청을 보내야 한다. csrf_token은 POST와 세트라는 점을 항상 기억하자.
Update
글을 수정하는 로직은 create와 유사한 점이 더 많다.
이제는 많이해서 익숙해진 URL, view, template 을 만들어보자.
# urls.py
path("<int:pk>/update/", views.update, name="update"),
# views.py
def update(request, pk):
article = get_object_or_404(Article, pk=pk)
if request.method == "POST":
form = ArticleForm(request.POST, request.FILES, instance=article)
if form.is_valid():
article = form.save(commit=False)
article.save()
return redirect("articles:detail", article.pk)
else:
form = ArticleForm(instance=article)
context = {
"form": form,
"article": article,
}
return render(request, "articles/update.html", context)
{% extends "base.html" %}
{% block content %}
<h2>[ Edit 페이지 ]</h2>
<form action="{% url 'articles:update' article.pk %}" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">수정</button>
</form>
<br>
<a href="{% url "articles:detail" article.pk %}">이전으로 돌아가기</a>
{% endblock content %}
'웹 개발' 카테고리의 다른 글
[Django] URL Namespace (0) | 2024.08.29 |
---|---|
[Django] Django form (0) | 2024.08.28 |
[Django] CRUD 구현하기 - 1(CR부분) (0) | 2024.08.23 |
[Django] Django ORM (0) | 2024.08.23 |
[Django] Django Model (0) | 2024.08.21 |