index.HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Articles</h1>
<a href="{% url "articles:new" %}">NEW</a>
<hr>
{% for article in articles %}
<p>글 번호: {{ article.pk }}</p>
<a href="{% url "articles:detail" article.pk %}">
<p>글 제목: {{ article.title }}</p>
</a>
<p>글 내용: {{ article.content }}</p>
<hr>
{% endfor %}
</body>
</html>
views.py
from .models import Article
# Create your views here.
def index(request):
articles = Article.objects.all()
context = {
'articles': articles,
}
return render(request, 'articles/index.html', context)
url.py
from django.urls import path
from . import views
app_name = 'articles'
urlpatterns = [
path('', views.index, name='index'),
path('<int:pk>/', views.detail, name='detail'),
]
views.py
def detail(request, pk):
article = Article.objects.get(pk=pk)
context = {
'article': article,
}
return render(request, 'articles/detail.html', context)
detail.html
<h1>Articles</h1>
<a href="{% url "articles:new" %}">NEW</a>
<hr>
{% for article in articles %}
<p>글 번호: {{ article.pk }}</p>
<a href="{% url "articles:detail" article.pk %}">
<p>글 제목: {{ article.title }}</p>
</a>
<p>글 내용: {{ article.content }}</p>
<hr>
{% endfor %}
사용자 입력 데이터를 받을 페이지 렌더링: new
사용자가 입력한 데이터를 받아 DB에 저장 : create
new 기능
- views.py
def new(request):
return render(request, 'articles/new.html')
<h1>New</h1>
<form action="{% url "articles:create" %}" method="POST">
{% csrf_token %}
<div>
<label for="title">Title: </label>
<input type="text" name="title" id="title">
</div>
<div>
<label for="content">Content: </label>
<textarea name="content" id="content"></textarea>
</div>
<input type="submit">
</form>
<hr>
<a href="{% url "articles:index" %}">[back]</a>
def create(request):
# print(request.GET) # <QueryDict: {'title': ['제목'], 'content': ['내용']}>
title = request.POST.get('title')
content = request.POST.get('content')
# 1
# article = Article()
# article.title = title
# article.content = content
# article.save()
# 2
article = Article(title=title, content=content)
article.save()
# 3
# Article.objects.create(title=title, content=content)
# return render(request, 'articles/create.html')
return redirect('articles:detail', article.pk)
POST는 단순 조회를 위한 GET과 달리 특정 리소스에 변경을 요구하는 의미와 기술적인 부분을 가지고 있기 때문
DB에 조작을 가하는 요청은 반드시 인증 수단이 필요
데이터베이스에 대한 변경사항을 만드는 요청이기 때문에 토큰을 사용하여 최소한의 신원 확인을 하는 것
def create(request):
....
return redirect('articles:detail', article.pk)def delete(request, pk):
# 몇번 글 삭제? -> 조회 먼저
article = Article.objects.get(pk=pk)
article.delete()
return redirect('articles:index')app_name = 'articles'
urlpatterns = [
path('<int:pk>/delete/', views.delete, name='delete'),
]Update를 구현하기 위해 2개의 view 함수가 필요
사용자 입력 데이터를 받을 페이지를 렌더링 : edit
사용자가 입력한 데이터를 받아 DB에 저장 : update
edit 기능 구현
def edit(request, pk):
article = Article.objects.get(pk=pk)
context = {
'article': article,
}
return render(request, 'articles/edit.html', context)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Edit</h1>
<form action="{% url "articles:update" article.pk %}" method="POST">
{% csrf_token %}
<input type="text" name="title" value="{{ article.title }}">
<textarea name="content">{{ article.content }}</textarea>
<input type="submit">
</form>
</body>
</html>
update 기능 구현
urlpatterns = [
path('<int:pk>/update/', views.update, name='update'),
]
def update(request, pk):
# 몇번 글 수정? -> 조회 먼저
article = Article.objects.get(pk=pk)
title = request.POST.get('title')
content = request.POST.get('content')
article.title = title
article.content = content
article.save()
return redirect('articles:detail', article.pk)