๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœ’๏ธ Python Programming/Frameworks

< django - 6 >

by A Lim Han 2022. 7. 30.

6. ์งˆ๋ฌธ ๋ชฉ๋ก + ํ…œํ”Œ๋ฆฟ ๋””๋ ‰ํ„ฐ๋ฆฌ + ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ + ํ…œํ”Œ๋ฆฟ ํƒœ๊ทธ ์œ ํ˜• + views.py + urls.py + ์˜ค๋ฅ˜ ํŽ˜์ด์ง€์™€ ์‘๋‹ต ์ฝ”๋“œ

 

 

 

# ์งˆ๋ฌธ ๋ชฉ๋ก

: http://localhost:8000/pybo/ ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ–ˆ์„ ๋•Œ ์งˆ๋ฌธ ๋ชฉ๋ก ์ถœ๋ ฅํ•˜๊ธฐ

 

1. pybo/views/py ํŒŒ์ผ์˜ index ํ•จ์ˆ˜๋ฅผ ์•„๋ž˜๊ฐ™์ด ๋ฐ”๊พผ๋‹ค.

+ ์งˆ๋ฌธ ๋ชฉ๋ก์˜ ๋ฐ์ดํ„ฐ๋Š” Question.objects.order_by('-create_date') ๋กœ ์–ป์„ ์ˆ˜ ์žˆ์Œ

+ order_by('-create_date')  --> ์ž‘์„ฑ ์ผ์‹œ๋ฅผ ์—ญ์ˆœ(=์ตœ์‹ ์ˆœ)์œผ๋กœ ์ •๋ ฌ ( ์—ฌ๊ธฐ์„œ ๋งˆ์ด๋„ˆ์Šค( - ) ๊ธฐํ˜ธ๊ฐ€ ์žˆ์œผ๋ฉด ์—ญ๋ฐฉํ–ฅ, ์—†์œผ๋ฉด ์ˆœ๋ฐฉํ–ฅ ์ •๋ ฌ )

+ render ํ•จ์ˆ˜ : ํŒŒ์ด์ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ…œํ”Œ๋ฆฟ์— ์ ์šฉํ•˜์—ฌ HTML๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

+ ํ…œํ”Œ๋ฆฟ(Template) ํŒŒ์ผ : ํŒŒ์ด์ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ ์“ธ ์ˆ˜ ์žˆ๋Š” HTML ํŒŒ์ผ (ex. pybo/question_list.html)

 

 

 

 

# ํ…œํ”Œ๋ฆฟ ๋””๋ ‰ํ„ฐ๋ฆฌ

1. ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ์„ ์ €์žฅํ•  ๋””๋ ‰ํ„ฐ๋ฆฌ ๋งŒ๋“ค๊ธฐ --> config/settings.pyํŒŒ์ผ์˜ TEMPLATES ํ•ญ๋ชฉ ์„ค์ •

ํŒŒ์ด๋ณด๋Š” BASE_DIR / 'templates' ๋””๋ ‰ํ„ฐ๋ฆฌ 1๊ฐœ๋งŒ ๋“ฑ๋ก

+ DIRS ๋Š” ํ…œํ”Œ๋ฆฟ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋‹ค์ˆ˜ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌ์ŠคํŠธ๋กœ ๋˜์–ด์žˆ์Œ

 

+ ์ถ”๊ฐ€ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์ „์ฒด ๊ฒฝ๋กœ

: c:\projects\mysite\templates

--> BASE_DIR / 'templates'์—์„œ BASE_DIR ์€ c:\projects\mysite ์ด๊ธฐ ๋•Œ๋ฌธ

 

 

 

2. ๋ช…๋ น ํ”„๋กฌํฌํŠธ์—์„œ ์œ„์—์„œ ์ถ”๊ฐ€ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

 

 

 

 

# ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ

- render ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•œ ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ๋ช… : pybo/question_list.html

- question_list.html ํŒŒ์ผ์ด ์ €์žฅ๋  ๊ฒฝ๋กœ : projects/mysite/templates/pybo/question_list.html

 

- pybo/question_list.htmlํŒŒ์ผ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑ

+ ํ…œํ”Œ๋ฆฟ ํƒœ๊ทธ : {%, %}์œผ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ๋ฌธ์žฅ

 

+ ์œ„ ์‚ฌ์ง„์— ์“ฐ์ธ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํƒœ๊ทธ

ํƒœ๊ทธ ์˜๋ฏธ
{% if question_list %} ๋งŒ์•ฝ question_list ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด
{% for question in question_list %} question_list ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ํ•˜๋‚˜์”ฉ ์ˆœ์„œ๋Œ€๋กœ question์— ๋Œ€์ž…ํ•œ๋‹ค,
{{ question.id }} for ๋ฌธ์— ์˜ํ•ด ๋Œ€์ž…๋œ question ๊ฐ์ฒด์˜ id๋ฒˆํ˜ธ ์ถœ๋ ฅ
{{ question.subject }} for ๋ฌธ์— ์˜ํ•ด ๋Œ€์ž…๋œ question ๊ฐ์ฒด ์ œ๋ชฉ ์ถœ๋ ฅ

 

+ ์œ„์˜ ๊ฒฝ์šฐ render ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ์งˆ๋ฌธ ๋ชฉ๋ก ๋ฐ์ดํ„ฐ๋Š” ํ…œํ”Œ๋ฆฟ์—์„œ ์‚ฌ์šฉํ•œ question_list๊ฐ€ ๋œ๋‹ค.

 

 

 

 

# ์žฅ๊ณ ์˜ ํ…œํ”Œ๋ฆฟ ํƒœ๊ทธ ์œ ํ˜•

 

1. ๋ถ„๊ธฐ ์œ ํ˜•

- ์‚ฌ์šฉ๋ฒ•

{% if ์กฐ๊ฑด๋ฌธ1 %}
    <p>์กฐ๊ฑด๋ฌธ1์— ํ•ด๋‹น๋˜๋Š” ๊ฒฝ์šฐ</p>
{% elif ์กฐ๊ฑด๋ฌธ2 %}
    <p>์กฐ๊ฑด๋ฌธ2์— ํ•ด๋‹น๋˜๋Š” ๊ฒฝ์šฐ</p>
{% else %}
    <p>์กฐ๊ฑด๋ฌธ1, 2์— ๋ชจ๋‘ ํ•ด๋‹น๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ</p>
{% endif %}

+ Python if ๋ฌธ๊ณผ ์œ ์‚ฌ

 

 

2. ๋ฐ˜๋ณต ์œ ํ˜•

- ์‚ฌ์šฉ๋ฒ•

{% for item in list %}
    <p>์ˆœ์„œ: {{ forloop.counter }} </p>
    <p>{{ item }}</p>
{% endfor %}

+ Python for ๋ฌธ๊ณผ ์œ ์‚ฌ

 

- ํƒฌํ”Œ๋ฆฟ for ๋ฌธ ์•ˆ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ forloop ๊ฐ์ฒด

forloop ์†์„ฑ ์˜๋ฏธ
forloop.counter ๋ฃจํ”„ ์•ˆ ์ˆœ์„œ๋Œ€๋กœ 1๋ถ€ํ„ฐ ํ‘œ์‹œ
forloop.counter0 ๋ฃจํ”„ ์•ˆ ์ˆœ์„œ๋Œ€๋กœ 0๋ถ€ํ„ฐ ํ‘œ์‹œ
forloop.first ๋ฃจํ”„์˜ ์ฒซ๋ฒˆ์งธ ์ˆœ์„œ์ธ ๊ฒฝ์šฐ True
forloop.last ๋ฃจํ”„์˜ ๋งˆ์ง€๋ง‰ ์ˆœ์„œ์ธ ๊ฒฝ์šฐ True

 

 

3. ๊ฐ์ฒด ์ถœ๋ ฅ ์œ ํ˜•

- ์‚ฌ์šฉ๋ฒ•

 { {  ๊ฐ์ฒด  } }     --> ๊ฐ์ฒด ์†์„ฑ ์—†๋Š” ๊ฒฝ์šฐ

 { {   ๊ฐ์ฒด, ๊ฐ์ฒด์˜ ์†์„ฑ  } }     --> ๊ฐ์ฒด ์†์„ฑ ์žˆ๋Š” ๊ฒฝ์šฐ

 

 

 

 

# ์งˆ๋ฌธ ์ƒ์„ธ์™€ urls.py

1. ๋กœ์ปฌ ์„œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๊ณ  http://localhost:8000/pybo/ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•œ๋‹ค.

์งˆ๋ฌธ 2๊ฐœ ์กฐํšŒ๋จ

 

 

 

2. ์œ„ ์‚ฌ์ง„์˜ ์งˆ๋ฌธ ๋ชฉ๋ก์„ ํด๋ฆญํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์˜ค๋ฅ˜๊ฐ€ ๋‚จ --> http://localhost:8000/pybo/2/ ๊ฐ™์€ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ URL ๋งคํ•‘์ด ์—†์–ด์„œ

 

 

 

 

# urls.py

- ์งˆ๋ฌธ ๋ชฉ๋ก ํ™”๋ฉด์—์„œ ๋งํฌ๋ฅผ ๋ˆŒ๋Ÿฌ ์š”์ฒญํ•œ ์งˆ๋ฌธ ์ƒ์„ธ URL

: http://localhost:8000/pybo/2/        <-- id ๊ฐ’์ด 2์ธ Queston ์„ ์ƒ์„ธ ์กฐํšŒํ•˜๋ผ๋Š” ์˜๋„

 

- ์œ„ URL์ด ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ pybo/urls.py ํŒŒ์ผ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •

path('<int:question_id>/', views.detail) &nbsp;๋ผ๋Š” URL ๋งคํ•‘์„ ์ถ”๊ฐ€ํ•จ

+  http://localhost:8000/pybo/2/    ํŽ˜์ด์ง€ ์š”์ฒญ --> ๋“ฑ๋กํ•œ ๋งคํ•‘ ๋ฃฐ์— ์˜ํ•ด http://localhost:8000/pybo/<int:question_id>/ ๊ฐ€ ์ ์šฉ --> queston_id ์— 2 ์ €์žฅ --> views.detail ํ•จ์ˆ˜ ์‹คํ–‰

 

+ < int :question_id> ์—์„œ  int ๋Š” ์ˆซ์ž๊ฐ€ ๋งคํ•‘๋จ์„ ์˜๋ฏธ

 

 

 

 

# views.py

- ์•„๋ž˜์™€ ๊ฐ™์ด pybo/views.py ํŒŒ์ผ์— detail ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

detail ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ „๋‹ฌ๋˜๋Š” ๋งค๊ฒŒ๋ณ€์ˆ˜์— question_id ๊ฐ€ ์ถ”๊ฐ€๋จ

+ ์ถ”๊ฐ€๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ question_id ์—๋Š” URL ๋งคํ•‘ ์‹œ ์ €์žฅ๋œ question_id ๊ฐ€ ์ „๋‹ฌ

http://localhost:8000/pybo/2/ํŽ˜์ด์ง€ ์š”์ฒญ ์‹œ ๋งค๊ฐœ๋ณ€์ˆ˜ queston_id ์— 2๊ฐ€ ์„ธํŒ…๋˜์–ด detail ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋จ

 

 

 

 

# question_detail.html

1. ์•„๋ž˜์ฒ˜๋Ÿผ detail ํ•จ์ˆ˜์—์„œ ์“ธ pybo/question_detail.html ํ…œํ”Œ๋ฆฟ ์ž‘์„ฑ

+ ์ „์ฒด ํŒŒ์ผ๋ช…์€ projects/mysite/templates/pybo/question_detail.html 

+ {{ question.subject }}๊ณผ {{ question.content }}์˜ question์€ detail ํ•จ์ˆ˜์—์„œ ํ…œํ”Œ๋ฆฟ์— context ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•œ Question ๋ชจ๋ธ ๊ฐ์ฒด์ž„

 

 

2. http://localhost:8000/pybo/2/ ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•œ๋‹ค.

์งˆ๋ฌธ ์ƒ์„ธ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ ์„ฑ๊ณต

 

 

 

 

# ์˜ค๋ฅ˜ ํŽ˜์ด์ง€์™€ ์‘๋‹ต ์ฝ”๋“œ

1. http://localhost:8000/pybo/30/ ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•œ๋‹ค.

DoesNotExist ์˜ค๋ฅ˜ ๋ฐœ์ƒ

+ DoesNotExist ์˜ค๋ฅ˜๋Š” Question.object.get(id=30)์ด ํ˜ธ์ถœ๋˜์–ด ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜์ž„ --> ์ „๋‹ฌ๋œ question_id๊ฐ€ 30์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒ

 

+ ๋ธŒ๋ผ์šฐ์ €์— ์ „๋‹ฌ๋˜๋Š” ์˜ค๋ฅ˜์ฝ”๋“œ = 500

 

+ HTTP์˜ ์ฃผ์š” ์‘๋‹ต์ฝ”๋“œ์˜ ์ข…๋ฅ˜

์˜ค๋ฅ˜์ฝ”๋“œ ์„ค๋ช…
200 ์„ฑ๊ณต (OK)
500 ์„œ๋ฒ„ ์˜ค๋ฅ˜ (Internal Server Error)
404 ์„œ๋ฒ„๊ฐ€ ์š”์ฒญํ•œ ํŽ˜์ด์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ X (Not Found)

 

 

 

 

2. ์ผ์ „์— http://localhost:8000/pybo/30/ ์ฒ˜๋Ÿผ ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๊ฒฝ์šฐ 500 ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹Œ 404 ํŽ˜์ด์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก detail ํ•จ์ˆ˜๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ • ํ›„ ๋‹ค์‹œ http://localhost:8000/pybo/30/ ํŽ˜์ด์ง€ ์š”์ฒญ

Question.objects.get(id=question_id)&nbsp; &nbsp; &nbsp;----->&nbsp; &nbsp; get_object_or_404(Question, pk=question_id)

+ ์‚ฌ์šฉํ•œ pk๋Š” Question ๋ชจ๋ธ์˜ ๊ธฐ๋ณธํ‚ค(Primary Key)์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ์˜๋ฏธํ•จ

 

500 ๋Œ€์‹  404 ์˜ค๋ฅ˜ํŽ˜์ด์ง€๊ฐ€ ์ถœ๋ ฅ๋จ

 

 

 

'โœ’๏ธ Python Programming > Frameworks' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

< django - 8 >  (0) 2022.08.01
< django - 7 >  (0) 2022.08.01
< django - 5 >  (0) 2022.07.30
< django - 4 >  (0) 2022.07.29
< django - 3 >  (0) 2022.07.28