DB에 있는 모든 게시물 가져오기
먼저 조회기능을 구현하기 위해서 DB에 있는 모든( all() ) 게시물들을 읽어서 뷰에서 처리하고 읽은 데이터를 template에 보내서 보여주려고 한다. URL path는 이미 만들었다고 가정하고 뷰를 작성해보자.
# views.py
from .models import Article
def articles(request):
articles = Article.objects.all()
context = {
"articles": articles,
}
return render(request, "articles.html", context)
articles = Article.objects.all() 통해서 model에 접근해서 모든 게시물을 가져온다.
가져온 데이터를 context에 담고 template으로 넘기는 로직을 작성했다.
{% extends "base.html" %}
{% block content %}
<h1>Articles</h1>
<ul>
{% for article in articles %}
<li>
<div>글 번호 : {{ article.id }}</div>
<div>글 제목 : {{ article.title }}</div>
<div>글 내용 : {{ article.content }}</div>
<br>
</li>
{% endfor %}
</ul>
{% endblock content %}
context로 넘어온 데이터를 for문을 통해 하나씩 돌면서 번호, 제목, 내용을 보여준다.
이처럼 model에 접근하여 데이터를 view에서 처리하여 template에 넘기고 마지막에 다시 view에서 렌더링을 하는 것이 Django에서 볼 수 있는 MTV패턴이다.
새로운 게시물 작성하기
새로운 게시물을 작성하기 위해서는 게시물을 작성할 form과 작성 로직이 있는 view, form을 보여줄 template이 필요하다.
우선 Django에서 제공하는 기능을 통해 작성 form을 만들어보자.
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = "__all__"
# exclude =
Article 모델의 모든 필드를 가져와서 form으로 사용하도록 정의했다.
exclude는 필요없는 필드가 있으면 제외시켜주는 역할을 하지만 지금은 쓰지 않았다.
from .forms import ArticleForm
def create(request):
if request.method == "POST":
form = ArticleForm(request.POST)
if form.is_valid():
article = form.save()
return redirect("articles:detail", article.pk)
else:
form = ArticleForm()
context = {"form": form}
return render(request, "articles/create.html", context)
articles/create/ 경로로 들어왔을 때(GET 요청이 들어왔을 때), 비어있는 폼을 가져와서 context에 담아 template에 넘긴다.
글을 작성하고 POST 요청을 날리면 폼안에 있는 데이터를 저장하고 방금 저장한 데이터의 상세 페이지를 보여준다.
{% extends "base.html" %}
{% block content %}
<h2>[ New 페이지 ] 새로운 게시글</h2>
<form action="{% url 'articles:create' %}" method="POST">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">저장</button>
</form>
<br>
<a href="{% url "articles:index" %}">홈으로 돌아가기</a>
{% endblock content %}
여기는 게시물을 작성하는 template이다. 아직 상세페이지는 구현하지않아서 작성페이지 밖에 없다.
POST방식일 때 절대 잊지 말아야할 점은 {% csrf_token %}을 빼먹지 않는 것이다.
사이트간 요청 위조 CSRF(Cross-Site-Request-Forgery)
유저가 실수로 해커가 작성한 로직을 따라 특정 웹페이지에 수정/삭제등의 요청을 보내게 되는 것이다.
정말 유저가 의도한 요청인지 검증이 필요한데 CSRF Token을 사용해서 막을 수 있다.
CSRF Token이란?
유저가 서버에 요청을 보낼 때 함께 제공되는 특별한 토큰 값으로, 이 토큰은 사용자의 세션과 연결되어 있다. 요청이 전송될 때, 함께 제출되며 서버는 요청을 받을 때 이 토큰을 검증하여 요청이 유효한지 확인하는 방식으로 CSRF을 방지한다.
일반적으로 GET을 제외한 데이터를 변경하는 Method에 적용하며 Django는 쉽게 구현할 수 있도록 template tag로 제공한다.
'웹 개발' 카테고리의 다른 글
[Django] Django form (0) | 2024.08.28 |
---|---|
[Django] CRUD 구현하기 - 2(RUD부분) (0) | 2024.08.26 |
[Django] Django ORM (0) | 2024.08.23 |
[Django] Django Model (0) | 2024.08.21 |
[웹 개발] 프론트엔드의 기능과 구조 이해 (0) | 2024.08.21 |