๐Ÿฆ ๋ฉ‹์‚ฌ 6๋ฒˆ์งธ ํ™œ๋™

ํ™ฉ๋‹ค์€ยท2023๋…„ 5์›” 11์ผ
0
post-thumbnail


์˜ค๋Š˜๋„ ๊ณ ๋ช…์ด ์‚ฌ์ง„์œผ๋กœ ์‹œ์ž‘........... ์Ÿค๋Š” ๋ญํ–ˆ๋‹ค๊ณ  ์ €๋ ‡๊ฒŒ ๊ธฐ์ ˆํ•ด์žˆ๋‚˜... ๋ถ€๋Ÿฝ๋‹ค,,



์ง€๋‚œ๋ฒˆ ํ™œ๋™์— ์ด์–ด์„œ ์˜ค๋Š˜์€ PhotoWeb์„ ์™„์„ฑํ–ˆ๋‹ค. ๊ตฌํ˜„ํ–ˆ๋˜ ๊ธฐ๋Šฅ์„ ์ฐธ๊ณ ํ•ด์„œ ํ•œ๋ฒˆ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค><

1. MTV ํŒจํ„ด์„ ์ด์šฉํ•œ ๊ธฐ๋Šฅ ๊ตฌํ˜„

๋จผ์ € Template์ด๋ž€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด๋Š” ๋ถ€๋ถ„์œผ๋กœ ์›น ํŽ˜์ด์ง€์˜ ๊ณจ๊ฒฉ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค. ์ฆ‰ HTML๋กœ ์ž‘์„ฑ๋œ ๋ถ€๋ถ„์„ ๋งํ•˜๋Š”๋ฐ Django์—์„œ์˜ ํ…œํ”Œ๋ฆฟ์€ ์ผ๋ฐ˜์ ์ธ HTML์ž‘์„ฑ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•˜๋‹ค.

ํ…œํ”Œ๋ฆฟ ํƒœ๊ทธ(Template Tag)

HTML์ด ํŒŒ์ด์ฌ ์ฝ”๋“œ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ๋„˜๊ฒจ๋ฐ›์•„ ์†์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋ฅผ ๋งํ•œ๋‹ค.
HTML์€ Hyper Text Markup Language๋กœ ๋งˆํฌ์—…์–ธ์–ด์— ์†ํ•˜๋Š”๋ฐ ๋งˆํฌ์—… ์–ธ์–ด๋Š” ์ •์ ์ธ ์›นํŽ˜์ด์ง€๋‹ค. ๋”ฐ๋ผ์„œ javascript๋ฅผ ์ด์šฉํ•ด ๋™์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผํ•˜๋Š”๋ฐ django์—์„œ๋Š” ์ด๋ฅผ ํ…œํ”Œ๋ฆฟ ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•ด ๋ฐ”๋กœ๋ฐ”๋กœ ์†์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

{}๋กœ ๊ฐ์‹ธ๋Š” ํ˜•ํƒœ๋กœ for๋ฌธ, if๋ฌธ๊ฐ™์€ ํŒŒ์ด์ฌ์˜ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ์— ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.



๋ทฐ(View)

ํ…œํ”Œ๋ฆฟ๊ณผ ๋ชจ๋ธ ์‚ฌ์ด๋ฅผ ์ด์–ด์ฃผ๋Š” ๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•œ๋‹ค. ๋ชจ๋ธ์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ณ  ํ…œํ”Œ๋ฆฟ์œผ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•œ ํ›„ ๋‹ค์‹œ ํ…œํ”Œ๋ฆฟ์— ์ „๋‹ฌ์„ ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
์˜ˆ์‹œ๋กœ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๋ฅผ ๋“ค์ˆ˜์žˆ๋‹ค.
1. ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ ๋ฐฑ์—”๋“œ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•œ๋‹ค.
2. ๋ฐฑ์—”๋“œ์—์„œ ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฝ‘์•„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
3. ์ฒ˜๋ฆฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ํ”„๋ก ํŠธ์—”๋“œ์—๊ฒŒ ์ œ๊ณตํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ  ๋‹ค์‹œ ๋Œ๋ ค์ฃผ๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

๋ทฐ์—๋Š” ํ•จ์ˆ˜ํ˜• ๋ทฐ์™€ ํด๋ž˜์Šคํ˜• ๋ทฐ๊ฐ€์žˆ๋‹ค.
๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด ํŒŒ์ด์ฌ ๊ธฐ๋ณธ๊ตฌ๋ฌธ์ธ ํ•จ์ˆ˜์™€ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ ๋ทฐ๋‹ค.
ํ•จ์ˆ˜ํ˜• ๋ทฐ๋Š” def ํ•จ์ˆ˜๋ช…์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ , ํด๋ž˜์Šคํ˜• ๋ทฐ๋Š” class ํด๋ž˜์Šค๋ช…์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค.
๊ตฌ์ฒด์ ์ธ ์ฐจ์ด๋Š” ๋‚˜์ค‘์— ๋‹ค๋ฃฐ ์˜ˆ์ •์ด๋ฏ€๋กœ ์ด๋ถ€๋ถ„์„ ๋‚˜๊ฐˆ๋•Œ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.



URL

๋ผ์šฐํŒ… ์—ญํ• ๊ณผ ๋™์‹œ์— ์„œ๋ฒ„๋กœ ํ•ด๋‹น ์ฃผ์†Œ์— ํ• ๋‹น๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
์ฆ‰, ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ ๋ฐฑ์—”๋“œ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ• ์ˆ˜์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ๋ณผ์ˆ˜์žˆ๋‹ค.
๋ฆฌ์†Œ์Šค๋Š” HTMLํŽ˜์ด์ง€์™€ ๋‚ด๋ถ€๋ฅผ ์ฑ„์šฐ๋Š” ๋ฐ์ดํ„ฐ๋„ ํฌํ•จ๋œ๋‹ค.
url์€ ์ด๋ก ๋ณด๋‹ค๋Š” ์‹ค์Šต์„ ํ†ตํ•ด์„œ ์ดํ•ดํ•˜๋Š”๊ฒŒ ๋” ๋น ๋ฅด๊ณ  ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ์‹ค์Šตํ™”๋ฉด์„ ํ†ตํ•ด ๊ธฐ๋กํ•ด๋ณด๊ฒ ๋‹ค.

๋ชจ๋ธ - ํ…œํ”Œ๋ฆฟ - ๋ทฐ - URL ์ˆœ์„œ๋กœ ์ž‘์—…ํ•  ์˜ˆ์ •์ด๋‹ค. (์ž‘์—… ์ˆœ์„œ๋Š” ์ƒ๊ด€์—†๋‹ค!)


1. ์‚ฌ์ง„ ๋ชฉ๋ก ํ™”๋ฉด


๐Ÿ‘‰ ๋‚˜๋Š” ๊ตฌ๊ธ€์—์„œ ์ฝ”์ฝ”๋ชฝ ์ด๋ฏธ์ง€ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์™€ ๋ชฉ๋ก ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€๋‹ค.


1) photo ํด๋” ์•ˆ์— templates ํด๋”๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“  ํ›„ ๊ตฌ๋ถ„์„ ์œ„ํ•ด templates ํด๋” ์•ˆ์— photo ํด๋”๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.




2) templates/photo ํด๋” ์•ˆ์— photo_list.html์„ ๋งŒ๋“ ๋‹ค.

photo_list.html์€ ์‚ฌ์ง„ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ฃผ๋Š” ํ…œํ”Œ๋ฆฟ์ด๋‹ค.

<!DOCTYPE>
<html>
<head>
    <meta charset="UTF-8">
    <title>Photo App</title>
</head>
<body>
    <h2>์‚ฌ์ง„ ๋ชฉ๋ก ํŽ˜์ด์ง€</h2>
    <section>
        {% for photo in photos %}
        <div>
            <h2>
                <a href="">{{photo.title}}</a>
            </h2>
            <img src="{{photo.image}}" width="50%">
            <p>{{photo.author}}</p>
            <p>{{photo.description}}</p>
        </div>
        {% endfor %}
    </section>
</body>
</html>

๐Ÿ’ก ํ…œํ”Œ๋ฆฟ ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค!



3) ์‚ฌ์ง„ ๋ชฉ๋ก์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ทฐ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

from django.shortcuts import render
from .models import Photo

def photo_list(request):
	photos = Photo.objects.all()
    return render(request, 'photo/photo_list.html', {'photos':photos})

โ‘  photo_list ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค.
โ‘ก Photo ๋ชจ๋ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๊ฐ€์ ธ์™€ {}์— ๋„ฃ์–ด ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค.
โ‘ข photo/photo_list.html์ด ์›น์— ๋ณด์—ฌ์งˆ ์ˆ˜ ์žˆ๋„๋ก ๊ฐ€๊ณตํ•˜์—ฌ ์ „๋‹ฌํ•œ๋‹ค.



4) ๋ฐฉ๊ธˆ ๋งŒ๋“  ๋ทฐ๋ฅผ URL์— ์—ฐ๊ฒฐํ•œ๋‹ค.

from django.urls import path
from . import views

urlpatterns = [
	path('', views.photo_list, name='photo_list),
]

โ‘  ํ˜„์žฌ ํด๋” ์•ˆ์—์žˆ๋Š” views.py๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
โ‘ก ''๋Š” ๋ฃจํŠธ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. (์ฆ‰, ์ฒ˜์Œ ๋“ค์–ด๊ฐ”์„๋•Œ ๋ณด์ด๋Š” ์ฒซ ํ™”๋ฉด, ๋ฉ”์ธ ํŽ˜์ด์ง€)
โ‘ข views.py์˜ photo_listํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ photo_list.html์„ ๋ณด์—ฌ์ค€๋‹ค.



5) ํ”„๋กœ์ ํŠธ URL์„ ์—ฐ๊ฒฐํ•œ๋‹ค.

path์˜†์— , include #๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
path('', include('photo.urls'), # urlpatterns ์•ˆ์— ์ด ๊ฒฝ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.

''๋Š” ๋ฃจํŠธ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ํ”„๋กœ์ ํŠธ urls.py์— photo/urls.py ํŒŒ์ผ์„ ๋“ฑ๋กํ•˜๋Š” ์ž‘์—…์ด๋‹ค.




2. ์„ธ๋ถ€ ์ •๋ณด ํ™”๋ฉด




1) photo/templates/photo ํด๋” ์•ˆ์— photo_detail.html์„ ์ƒ์„ฑํ•œ๋‹ค.




2) ์„ธ๋ถ€ ์ •๋ณด ๋ทฐ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

def photo_detail(request, pk):
	photo = get_object_or_404(Photo, pk=pk)
    return render(request, 'photo/photo_detail.html', {'photo':photo})

โ‘  photo_detail ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค. pk๋Š” ๋ชจ๋ธ์˜ ๋ฐ์ดํ„ฐ์ธ ์‚ฌ์ง„์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ณ€์ˆ˜๋‹ค.
โ‘ก ์ฐพ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ(์‚ฌ์ง„์„)๋ฅผ, ์—†์œผ๋ฉด 404์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋‹ค.
โ‘ข photo/photo_detail.html์ด ์›น์— ๋ณด์—ฌ์งˆ ์ˆ˜ ์žˆ๋„๋ก ๊ฐ€๊ณตํ•˜์—ฌ ์ „๋‹ฌํ•œ๋‹ค.



3) ๋ฐฉ๊ธˆ ๋งŒ๋“  ์„ธ๋ถ€ ์ •๋ณด ๋ทฐ๋ฅผ URL์— ์—ฐ๊ฒฐํ•œ๋‹ค.

path('photo/<int:pk>/', views.photo_detail, name='photo_detail'),

pk๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ๋ถ„์„ ์ •์ˆ˜ํ˜•์œผ๋กœ ํ•˜๊ธฐ์œ„ํ•ด int๋กœ ์ฃผ์—ˆ๋‹ค.



4) ํ…œํ”Œ๋ฆฟ์— url์„ ๋ฐ˜์˜ํ•œ๋‹ค.

<a href="{% url 'photo_detail' pk=photo.pk %}">{{photo.title}}</a>

์œ„์— ์ž‘์„ฑํ–ˆ๋˜ photo_list.html์— ๋น„์–ด์žˆ๋˜ aํƒœ๊ทธ์•ˆ์— ์„ธ๋ถ€ ์ •๋ณด url์„ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.

3. ์ž‘์„ฑ ํ™”๋ฉด

  • ์ž‘์„ฑ ๊ธฐ๋Šฅ์„ ๋„ฃ์œผ๋ ค๋ฉด ๋จผ์ € ํผ(form)์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•œ๋‹ค.
    ํผ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•ด ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋„๋ก ๋„์™€์ฃผ๋Š” ์–‘์‹์ด๋‹ค.
    ์‚ฌ์šฉ์ž๊ฐ€ ์–‘์‹์„ ์ฑ„์šฐ๊ณ  POST ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

1) photo/templates/photo ํด๋” ์•ˆ์— photo_post.html์„ ์ƒ์„ฑํ•œ๋‹ค.

<!DOCTYPE>
<html>
<head>
    <meta charset="UTF-8">
    <title>Photo App</title>
</head>
<body>
	<h1><a href="/">ํ™ˆ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ</a></h1> 
    <div>
    	<section>
            <h2>New Photo</h2>
                <form method="POST">
                	{% csrf_token %} {{form.as_p}}
                    <button type="submit">์™„๋ฃŒ!</button>
                </form>
          </section>   
    </div>
</body>
</html>

โ‘  form์—์„œ POST ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
โ‘ก csrf ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ์œ„ํ•ด csrf_token์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.
โ‘ข form.as_p๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ์™€ ํ…์ŠคํŠธ๊ฐ€ <p> ์•ˆ์— ์ž‘์„ฑ๋˜๊ฒŒ ํ•œ๋‹ค.



form ํƒœ๊ทธ ๋ฐ์ดํ„ฐ ์ „์†ก ๋ฐฉ๋ฒ•(method)

1. GET

  • ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ URL์— ๋ถ™์—ฌ ์ „์†กํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค ๋ณด์—ฌ ๋ณด์•ˆ์— ์ทจ์•ฝํ•˜๋‹ค.
  • ์ „์†ก ์†๋„๋Š” POST ๋ฐฉ์‹๋ณด๋‹ค ๋น ๋ฅด๋‹ค.
  • ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ „์†ก์„ ํ•˜๊ฑฐ๋‚˜ ๊ฒ€์ƒ‰๊ฒฐ๊ณผ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜๊ณ  ๋ณด์•ˆ์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

2. POST

  • ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณธ๋ฌธ์•ˆ์— ํฌํ•จํ•ด์„œ ์ „์†กํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ URL์— ๋ณด์ด์ง€ ์•Š์•„ GET๋ฐฉ์‹๋ณด๋‹ค ๋ณด์•ˆ์— ์šฐ์ˆ˜ํ•˜๋‹ค.
  • ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…์ฒ˜๋Ÿผ ๋ณด์•ˆ์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋ณต์žกํ•œ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

CSRF(Cross-Site Request Forgery, ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ ์œ„์กฐ)

  • ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์˜๋„ํ•˜์ง€์•Š์€ ์š”์ฒญ์œผ๋กœ ๋งŒ๋“ค์–ด ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋Š” ๊ณต๊ฒฉ
  • ์„œ๋ฒ„์—์„œ ๋žœ๋ค ๊ฐ’์„ ์ƒ์„ฑํ•ด response์— ํฌํ•จํ•˜์—ฌ ์ „๋‹ฌ๋˜๊ณ , ์‚ฌ์šฉ์ž ์„ธ์…˜ ์ •๋ณด์™€ ์—ฐ๊ด€๋˜์–ด ์„œ๋ฒ„์— ์ „์†กํ•˜๊ณ  ์„œ๋ฒ„๋Š” ํ† ํฐ๊ณผ ์„ธ์…˜์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

POST ๋ฐฉ์‹ ์‚ฌ์šฉ์‹œ ์ฃผ์˜์‚ฌํ•ญ
1. form์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ• ๋•Œ csrf_token์ด ๊ฐ™์ด ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋„๋ก ์ˆจ๊น€ ๋ฐ์ดํ„ฐ๋กœ ๊ฐ™์ด ์ „์†กํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.
2. Django์—์„œ๋Š” ๋ชจ๋“  POST ์š”์ฒญ์— ๋Œ€ํ•ด CSRFํ† ํฐ์„ ๊ฒ€์‚ฌํ•œ๋‹ค.




3) photo/forms.py์„ ์ƒ์„ฑํ•œ๋‹ค.

from django import forms
from .models import Photo

class PhotoForm(forms.ModelForm):
	class Meta:
    	model = Photo
        fields = ('title', 'author', 'image', 'description')

์‚ฌ์ง„์„ ๋“ฑ๋กํ•˜๋Š” ํผ์„ PhotoForm์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.



4) ์ž‘์„ฑ ๋ทฐ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

from .forms import PhotoForm

def photo_post(request):
	if request.method == "POST":
    	form = PhotoForm(request.POST)
        if form.is_valid():
        	photo = form.save(commit=False)
            photo.save()
            return redirect('photo_detail, pk=photo.pk)
    else:
        form = PhotoForm()
    return render(request, 'photo/photo_post.html', {'form':form})

โ‘  ํ˜„์žฌ ํด๋” ์•ˆ์— ์žˆ๋Š” forms.py์˜ PhotoForm ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
โ‘ก photo_post ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค.
โ‘ข ์กฐ๊ฑด๋ฌธ์œผ๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์ด POST์ธ์ง€ ํŒ๋ณ„ํ•œ๋‹ค.
โ‘ฃ ์š”์ฒญ์ด POST์ด๋ฉด ํ…œํ”Œ๋ฆฌ์˜ ํผ์— ์žˆ๋Š” ๋ฒ„ํŠผ์ด ๋ˆŒ๋ฆฐ ๊ฒƒ์ด๋‹ค.(์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์ง„์„ ์˜ฌ๋ฆฐ๋‹ค๋Š” ๋œป์ด๋‹ค)
โ‘ค ์š”์ฒญ์œผ๋กœ ๋“ค์–ด์˜จ ํผ ๋ฐ์ดํ„ฐ๋ฅผ form ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.
โ‘ฅ ํผ์— ๋งž์ถฐ ์ž˜ ์ž‘์„ฑ๋œ ๋ฐ์ดํ„ฐ์ธ์ง€ ๊ฒ€์‚ฌํ•˜๊ณ  ์ด ๋ฐ์ดํ„ฐ๋ฅผ photo์— ์ €์žฅํ•ด DB์— ์ €์žฅํ•œ๋‹ค.
โ‘ฆ ๋‹ค์‹œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™์‹œํ‚จ๋‹ค.(photo_detail๋กœ)
โ‘ง POST์š”์ฒญ์ด ์•„๋‹ˆ๋ฉด ์ƒˆ๋กœ ๋“ค์–ด์˜จ ์‚ฌ์šฉ์ž์ด๋ฏ€๋กœ ํผ์„ ์ œ๊ณตํ•œ๋‹ค.
โ‘จ ํ…œํ”Œ๋ฆฟ๊ณผ form์„ ๋„˜๊ฒจ์ฃผ์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ํ™”๋ฉด์„ ์ œ๊ณตํ•œ๋‹ค.(photo_post.html)




5) ๋ฐฉ๊ธˆ ๋งŒ๋“  ์ž‘์„ฑ ๋ทฐ๋ฅผ URL์— ์—ฐ๊ฒฐํ•œ๋‹ค.

path('photo/new/', views.photo_post, name='photo_post'),

์ž‘์„ฑํ•˜๋Š” ํŽ˜์ด์ง€์˜ ์ฃผ์†Œ์ฐฝ์— new/๋ฅผ ๋ณด์ด๊ฒŒ ํ•˜๊ณ , photo_post ํ•จ์ˆ˜๋กค ํ˜ธ์ถœํ•œ๋‹ค.



6) ๋ฉ”์ธํ™”๋ฉด ํ…œํ”Œ๋ฆฟ์— url์„ ๋ฐ˜์˜ํ•œ๋‹ค.

<h3><a href="{% url 'photo_post' %}">New Photo</a></h3>

photo_list.html์— New Photo๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋ทฐ๋ฅผ ํ†ตํ•ด photo_post๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. (ํ…œํ”Œ๋ฆฟ๋„ ๋ฆฌํ„ด)




4. ์ˆ˜์ • ํ™”๋ฉด

์ˆ˜์ •ํ™”๋ฉด์€ ์ž‘์„ฑํ™”๋ฉด๊ณผ ๋‹ค๋ฅผ๊ฒŒ ๋ณ„๋กœ ์—†๋‹ค. ๋˜‘๊ฐ™์ด ํผ์„ ๋ฐ›์•„์•ผํ•˜๊ณ  POST๋ฐฉ์‹์œผ๋กœ ์ „์†ก์„ ํ•˜์ง€๋งŒ ์ด๋ฏธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฑ„์›Œ์ ธ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋‹ค๋ฅด๋‹ค. ์ด ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ•ด์„œ ๊ตฌํ˜„์„ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.


  • ๋จผ์ € ์ž‘์„ฑ ๊ธฐ๋Šฅ๊ณผ ํผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋˜‘๊ฐ™๊ธฐ๋•Œ๋ฌธ์— post.html์„ ๊ทธ๋Œ€๋กœ ์ด์šฉํ•˜๊ฒ ๋‹ค. (์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ˆ˜์ • ํ…œํ”Œ๋ฆฟ์„ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค!)

1) ์ˆ˜์ • ๋ทฐ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

def photo_edit(request, pk):
	photo = get_object_or_404(Photo, pk=pk)
    if request.method == "POST":
    	form = PhotoForm(request.POST, instance=photo)
        if form.is_valid():
        	photo = form.save(commit=False)
            photo.save()
            return redirect('photo_detail', pk=photo.pk)
    else:
    	form = PhotoForm(instance=photo)
    return render(request, 'photo/photo_post.html', {'form':form})

โ‘  photo_edit ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค.
โ‘ก ์ˆ˜์ •ํ•  ๋Œ€์ƒ์„ pk๋กœ ์ฐพ์•„์˜ค๋Š”๋ฐ, ์ฐพ๋Š” ๋Œ€์ƒ์ด ์—†์œผ๋ฉด 404 ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
โ‘ข ๋“ค์–ด์˜จ ์š”์ฒญ์ด POST์ธ์ง€ ํŒ๋ณ„ํ•˜๊ณ  ์ˆ˜์ •์„ ์˜๋ฏธํ•˜๋Š” POST์ด๋ฉด
โ‘ฃ instance ๋ณ€์ˆ˜์— ์ˆ˜์ • ๋Œ€์ƒ์ด ๋  ๋ฐ์ดํ„ฐ๋ฅผ ์„ ์ •ํ•œ๋‹ค.
โ‘ค ํผ์— ๋งž๊ฒŒ ์ž˜ ์ž‘์„ฑ๋œ ๋ฐ์ดํ„ฐ์ธ์ง€ ํ™•์ธ ํ›„ DB์— ์ €์žฅํ•œ๋‹ค.
โ‘ฅ photo_detail, ์ฆ‰ ์„ธ๋ถ€ ํ™”๋ฉด ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ด์„œ ์ˆ˜์ •๋œ ํ™”๋ฉด์„ ๋ณด์—ฌ์ค€๋‹ค.
โ‘ฆ GET ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด photo ๋ฐ์ดํ„ฐ๋ฅผ instance๋ณ€์ˆ˜์— ๋‹ด์•„ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋„๋ก ์ฒ˜๋ฆฌํ•œ๋‹ค.
โ‘ง ์กฐ๊ฑด๋ฌธ์ด ๋๋‚˜๋ฉด photo_postํ™”๋ฉด์„ ๋ณด์—ฌ์ค€๋‹ค.




2) ์ˆ˜์ • ๋ทฐ๋ฅผ URL์— ์ž‘์„ฑํ•œ๋‹ค.

path('photo/<int:pk>/edit/', views.photo_edit, name='photo_edit),

pk๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณ  ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆซ์ž๋กœ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์ •์ˆ˜ํ˜•(int)์œผ๋กœ ๋ฐ›์•„์˜จ๋‹ค.





3) ์„ธ๋ถ€ํ™”๋ฉด ํ…œํ”Œ๋ฆฟ์— url์„ ๋ฐ˜์˜ํ•œ๋‹ค.

<h3><a href="{% url 'photo_edit' pk=photo.pk %}">Edit Photo</a></h3>

์ด๊ฒŒ ๋งˆ์ง€๋ง‰~~~


์ด๋ ‡๊ฒŒ ์ฒซ๋ฒ„์งธ ์žฅ๊ณ  ์‹ค์Šต์ด ๋๋‚ฌ๋‹ค......
์ •๋ง ๊ฐ„๋‹จํ•œ ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์‹ค์Šต์ด์˜€๋Š”๋ฐ, ์ƒ๊ฐ๋ณด๋‹ค ๋‹ค์–‘ํ•œ ์˜ค๋ฅ˜๋ฅผ ์ ‘ํ–ˆ๊ณ  ๊ตฌํ˜„ํ•ด์•ผํ•  ๋ถ€๋ถ„์ด ๋งŽ์•˜๋‹ค..
๊ทธ๋ž˜๋„ ์—๋Ÿฌ ์žก๋Š”๊ฑฐ ๋„ˆ๋ฌด ์พŒ๊ฐ ์žˆ์–ด>< ์žฌ๋ฐŒ์–ด>< (๋Š” ํ•ด๊ฒฐํ•ด์„œ ๋‹คํ–‰์“ฐ^^)


๋‘๋ฒˆ์งธ ์‹ค์Šต์€ Todo๋ฆฌ์ŠคํŠธ๋กœ ์ง„ํ–‰ํ•  ์˜ˆ์ •์ธ๋ฐ ํ›„๋‹ค๋‹ค๋‹ฅ ๋๋‚ด๊ธฐ ๋„์ „!

0๊ฐœ์˜ ๋Œ“๊ธ€