C : Create
R : Read
U : Update
D : Delete
오늘 배울 함수
- edit : edit.html을 보여줌
- update : 데이터베이스에 변경사항을 적용
urls.py
에서 url을 지정할 때, "<str:id>"
로 했던 것을 기억하기!def edit(request, id): # create와 다른점. (id 값을 받아야 함.)
edit_blog = Blog.objects.get(id = id)
# edit_blog = get_object_or_404(Blog, pk = id) 둘 중 어떤 방법을 사용해도 상관이 없다.
return render(request, 'edit.html', {"blog" : edit_blog})
<body>
<h2>Update Your Blog</h2>
<form action="" method="post">
{%csrf_token%}
<p>제목 : <input type="text" name="title" value="{{blog.title}}" /></p>
<p>작성자 : <input type="text" name="writer" value="{{blog.writer}}" /></p>
본문 :
<textarea name="body" id="" cols="30" rows="10">
{{blog.body}}
</textarea>
<br />
<input type="submit" value="submit" />
</form>
</body>
Create
와 마찬가지로 method="post"
로 해준다.Update
함수를 만들고 나서 넣을 예정이다.path('edit/<str:id>', edit, name="edit"),
create 함수
def create(request):
new_blog = Blog()
new_blog.title = request.POST['title']
new_blog.writer = request.POST['writer']
new_blog.body = request.POST['body']
new_blog.pub_date = timezone.now()
new_blog.save()
return redirect('detail', new_blog.id)
update 함수
def update(request, id): # 수정을 해야할 id 값을 받아야 한다. (Create와의 차이점!)
update_blog = Blog.objects.get(id=id) # 이 id 값에 해당하는 객체의 컬럼을 edit에서 온 정보들로 덮어씌워야 함.
update_blog.title = request.POST['title']
update_blog.writer = request.POST['writer']
update_blog.body = request.POST['body']
update_blog.pub_date = timezone.now()
update_blog.save()
return redirect('detail', update_blog.id)
detail.html
로 수정한 데이터를 넘겨주어야 하기 때문에 redirect를 통해 update_blog.id
를 넘겨준다.<body>
<h2>Update Your Blog</h2>
<form action="{% url 'update' blog.id %}" method="post">
{%csrf_token%}
<p>제목 : <input type="text" name="title" value="{{blog.title}}" /></p>
<p>작성자 : <input type="text" name="writer" value="{{blog.writer}}" /></p>
본문 :
<textarea name="body" id="" cols="30" rows="10">
{{blog.body}}
</textarea>
<br />
<input type="submit" value="submit" />
</form>
</body>
✋ 여기서 잠깐 !✋
path converter를 사용할 때 주의할 점!
html 내부에서 a 태그로 url을 넘겨줄 때, 꼭 id값을 같이 넣어주자!
그래야 url에서 지정해주었던 곳에 id값이 들어갈 수 있다.
✋ 여기서 잠깐 !✋
def update(request, id):
blog = Blog.objects.get(id = id)
if request.method == "POST": # string으로 POST, GET이 가져와진다.
blog.title = request.POST["title"]
blog.writer = request.POST["writer"]
blog.body = request.POST["body"]
blog.save()
return redirect('detail', blog.id)
return render(reqeust, "update.html", {"blog" : blog})
path('update/<str:id>', update, name="update"),
path converter
를 써주어야 한다.update를 만들어 줄 때 create와 달리 id 값을 불러오는 것을 잊지말자.
path-converter를 사용할 때 이전의 정리에서는 <str:id>
를 사용하곤 하였는데,
url 패턴과의 매치 문제로 인해 보통은 <int:id>
로 사용한다고 하니 참고하도록 하자.
<int:id>
specifies two things: A path converter (int)
and the variable name (id)
that you want to capture. In this case, only URLs where this part is integer will match the pattern. id will always be an integer.