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

ํ™ฉ๋‹ค์€ยท2023๋…„ 5์›” 19์ผ
0


๊ณ ๋ช…ํ‹ฐ์ฝ˜์ด๋ผ๊ณ  ์–ธ๋‹ˆ๊ฐ€ ๋ณด๋‚ด์ค€ ์‚ฌ์ง„ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ ๊ท€์—ฝ๊ตฐ....
๋ฒจ๋กœ๊ทธ์˜ ์‹œ์ž‘์„ ๊ณ ๋ช…์ด ์‚ฌ์ง„์œผ๋กœ ํ•˜๋‹ˆ๊นŒ ๊ท€์—ฌ์›Œ์„œ ์“ฐ๋Š”๋ง›์ด ๋‚œ๋‹ค........




์ด๋ฒˆํ™œ๋™์—์„œ๋Š” Todo List๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ™œ๋™์„ ํ–ˆ๋Š”๋ฐ ์‹œ๊ฐ„์ด ๋ถ€์กฑํ•ด์„œ ์ƒ์„ธ์กฐํšŒ ํ…œํ”Œ๋ฆฟ์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ์ง„ํ–‰ํ–ˆ๋‹ค... ๋‹ค์Œ ํ™œ๋™๋ถ€ํ„ฐ๋Š” ๋นก์„ธ๊ฒŒ ๋‚˜๊ฐ€์•ผ์ฅ..

1. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

1.1 ๋จผ์ € ์ƒˆ๋กœ์šด ํด๋”(์ž‘์—…๊ณต๊ฐ„)๋ฅผ ๋งŒ๋“ค์–ด์„œ ์žฅ๊ณ ๋ฅผ ๋‹ค์šด๋ฐ›๋Š”๋‹ค

pip install django


1.2 mytodo ๋ผ๋Š” ์žฅ๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ํ˜„์žฌ ์œ„์น˜์— ๋งŒ๋“ค์–ด์ค€๋‹ค

django-admin startproject mytodo .

์œ„ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด mytodo ๋ผ๋Š” ํด๋”์™€ ํ•จ๊ป˜ manage.py ํŒŒ์ผ์ด ๊ฐ™์ด ์ƒ๊ธด๋‹ค!


1.3 ํ”„๋กœ์ ํŠธ์—์„œ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•  todo ์•ฑ์„ ๋งŒ๋“ค์–ด์ค€๋‹ค

python manage.py startapp todo .

์œ„ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด todo ํด๋”๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค!



2. ํ”„๋กœ์ ํŠธ ์„ค์ •

2.1 ์•ฑ์„ ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ ์•ฑ์„ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•œ๋‹ค

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ settings.py ํŒŒ์ผ์ด ์ถ”๊ฐ€๋˜์–ด์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‹ค์–‘ํ•œ ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ INSTALLED_APPS ๊ฐ’์˜ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์— ๋ฐฉ๊ธˆ ๋งŒ๋“  todo ์•ฑ์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค
์š”๋ ‡๊ฒŒ!

2.2 ์‹œ๊ฐ„๋Œ€ ๋ฐ”๊พธ๊ธฐ

์šฐ๋ฆฌ๊ฐ€ todo๋ฅผ ๋“ฑ๋กํ•˜๋ฉด ๋“ฑ๋กํ•œ ์‹œ๊ฐ„์„ ์šฐ๋ฆฌ๋‚˜๋ผ ๊ธฐ์ค€์œผ๋กœ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด settings.py์— TIME_ZONE์„ Asia/Seoul๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค

  • ์ด ๋ถ€๋ถ„์€ ํ•„์ˆ˜๋Š” ์•„๋‹ˆ๋‹ค...!


2.3 ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ

todoList๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ด€๋ฆฌ์ž ๊ณ„์ •์„ ์ƒ์„ฑํ•ด์ค€๋‹ค. ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€์„œ ๋กœ๊ทธ์ธ ํ•  ๋•Œ ํ•„์š”ํ•œ ๊ณ„์ •์ด๋‹ค.

python manage.py createsuperuser

  • username(์•„์ด๋””), Email, password, password(again)์„ ์ž…๋ ฅํ•˜๋ฉด ๊ณ„์ • ์ƒ์„ฑ ์™„๋ฃŒ!
  • ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์œ ์‚ฌํ•œ์ง€, ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์งง์€์ง€๊นŒ์ง€ ํ™•์ธํ•œ๋‹ค
  • ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ์‹œ ์ปค์„œ๊ฐ€ ์›€์ง์ด์ง€์•Š์•„ ํ—ท๊ฐˆ๋ฆฌ๋ฏ€๋กœ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค!



3. Todo ๋ชจ๋ธ ์ƒ์„ฑ

todoํด๋” ์•ˆ์— ์žˆ๋Š” models.py์— ์ƒ์„ฑํ•  ๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด์ค€๋‹ค. ๋ชจ๋ธ์€ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š”๋ฐ django์˜ db์— ์žˆ๋Š” modelํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ๋งŒ๋“ ๋‹ค.
todo์— ๊ธฐ๋ณธ์ ์œผ๋กœ ๋“ค์–ด๊ฐ€์•ผํ•˜๋Š” ํ•„๋“œ๋ฅผ ์ œ๋ชฉ๊ณผ ์„ค๋ช…, ์ƒ์„ฑ๋‚ ์งœ, ์™„๋ฃŒ์—ฌ๋ถ€, ์ค‘์š”๋„ ๋“ฑ์œผ๋กœ ์ •ํ•ด์ฃผ์—ˆ๋‹ค.

class Todo(models.Model):
	title = models.CharField(max_length=50)
    description = models.TextField(blank=True)
    created = models.DateTimeField(auto_no_add=True)
    complete = models.BooleanField(default=False)
    important = models.BooleanField(default=False)
    
    def __str__(self):
    	return self.title

์™„๋ฃŒ์—ฌ๋ถ€๋Š” ๋‚˜์ค‘์— todo์—์„œ ์™„๋ฃŒ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์™„๋ฃŒ๋ชฉ๋ก์œผ๋กœ ๋”ฐ๋กœ ๋„˜๊ธธ ์˜ˆ์ •์ด๋‹ค
์™„๋ฃŒ์—ฌ๋ถ€์™€ ์ค‘์š”๋„๋Š” todo๋ฅผ ๋“ฑ๋กํ• ๋•Œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋ณธ๊ฐ’์„ False๋กœ ์ง€์ •ํ•ด์ค€๋‹ค

__str__ ํ•จ์ˆ˜๋Š” ํ•ด๋‹น todo์˜ title(๋ฌธ์ž์—ด)๋กœ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋‹ค

3.1 ์ƒ์„ฑํ•œ ๋ชจ๋ธ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•œ๋‹ค

๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด์ฃผ์—ˆ์œผ๋ฉด ์ด ๋ชจ๋ธ์„ ๊ด€๋ฆฌ์ž๊ฐ€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ดˆ๊ธฐํ™” ํ•˜๊ณ  ๊ธฐ๋กํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. ์ด ์ž‘์—…์„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜/๋งˆ์ด๊ทธ๋ ˆ์ดํŠธ ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค

python manage.py makemigrations

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. db.sqlite3 ํŒŒ์ผ์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ธฐ๋กํ•œ๋‹ค.

python manage.py migrate

๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•œ๋‹ค.

3.2 Todo ๋ชจ๋ธ ๋“ฑ๋ก

๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์—์„œ ๋ฐฉ๊ธˆ ๋งŒ๋“  ๋ชจ๋ธ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก Todo ๋ชจ๋ธ์„ ๋“ฑ๋กํ•ด์•ผํ•œ๋‹ค.
todoํด๋”์•ˆ์— admin.py์— ๋ชจ๋ธ์„ ๋“ฑ๋กํ•ด์ค€๋‹ค.

from .models import Todo

ํ˜„์žฌ ํด๋”์•ˆ์— ์žˆ๋Š” models.py์— ์žˆ๋Š” Todo ํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

admin.site.register(Todo)

๊ด€๋ฆฌ์ž ์‚ฌ์ดํŠธ์— ๋ชจ๋ธ Todo๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.

3.3 ๊ด€๋ฆฌ์žํŽ˜์ด์ง€ URL ์„ค์ •

ํ”„๋กœ์ ํŠธ ํด๋”์ธ mytodo ์•ˆ์— ์žˆ๋Š” urls.py์— ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๋ฅผ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.
๋ณดํ†ต ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์˜ path๋Š” ๋“ฑ๋ก๋˜์–ด์žˆ๋Š”๋ฐ ํ˜น์‹œ ๋ชจ๋ฅด๋‹ˆ ํ™•์ธ ํ•ด์ค€๋‹ค.

urlpattern = [
	path('admin/', admin.site.urls),
]

4. Todo ์ „์ฒด ์กฐํšŒ ๊ธฐ๋Šฅ

๋‚˜๋Š” ์žฅ๊ณ ์˜ MTVํŒจํ„ด์„ ๋”ฐ๋ผ์„œ Model-Template-View ์ˆœ์„œ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ๊ฒƒ์ด๋‹ค.
์™„๋ฃŒ๋˜์ง€์•Š์€ Todo๋งŒ ๋ณด์—ฌ์ฃผ๋„๋ก ๊ตฌํ˜„ํ•  ์˜ˆ์ •์ด๋‹ค. ๋จผ์ € Todo ์ „์ฒด ์กฐํšŒ ํŽ˜์ด์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ…œํ”Œ๋ฆฟ์„ ์ƒ์„ฑํ•œ๋‹ค.
๋จผ์ € todo์•ฑ ์•ˆ์— templates ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์•ˆ์— ๋‹ค์‹œ todo ํด๋”๋ฅผ ๋งŒ๋“ค์–ด todo_list.html ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค.


<todo_list.html>

<html>
    <head>
        <title>Todo List</title>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.1/font/boot-strap-icons.css">
    </head>
    <body>
        <div class="container">
            <h1>Todo List</h1>
            <p>
                <a href=""><i class="bi-plus">Add Todo</i></a>
                <a href="" class="btn btn-primary" style="float:right">์™„๋ฃŒํ•œ Todo ๋ชฉ๋ก</a>
            </p>
            <ul class="list-group">
                {% for todo in todos %}
                <li class="list-group-item">
                    <a href="">{{todo.title}}</a>
                    {% if todo.important %}
                        <span class="badge badge-danger">!</span>
                    {% endif %}
                    <div style="float:right">
                        <a href="" class="btn btn-danger">์™„๋ฃŒ</a>
                        <a href="" class="btn btn-outline-primary">์ˆ˜์ •ํ•˜๊ธฐ</a>
                    </div>
                </li>
                {% endfor %}
            </ul>
        </div>
    </body>
</html>

์ด๋ฒˆ TodoList ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ฐ€์žฅ ์œ ๋ช…ํ•˜๊ณ  ์˜ค๋ž˜๋œ CSS ํ”„๋ ˆ์ž„์›Œํฌ์ธ Bootstrap์„์‚ฌ์šฉํ–ˆ๋‹ค
๋ฏธ๋ฆฌ ์Šคํƒ€์ผ์ด ์ •์˜๋˜์–ด์žˆ๊ณ  ์‚ฌ์šฉ๋ฒ•์ด ๊ฐ„๋‹จํ•ด์„œ ๊ธฐ๋ณธ์ ์ธ ์Šคํƒ€์ผ์ด ์ ์šฉ๋œ TodoList๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ๋‹ค

Bootstrap์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ

1. css ํŒŒ์ผ์„ ๋ฐ›์•„์™€ ํ”„๋กœ์ ํŠธ ํด๋”์— ์ง‘์–ด๋„ฃ๋Š” ๋ฐฉ์‹
2. ์›น ๋งํฌ ํ˜•ํƒœ๋กœ ์ œ๊ณต๋˜๋Š” css ํŒŒ์ผ์„ ๊ฐ€์ ธ๋‹ค ์“ฐ๋„๋ก ์ฐธ์กฐ ํ•˜๋Š” ๋ฐฉ์‹์ด ์žˆ๋‹ค

๋ฏธ๋ฆฌ ์ž‘์„ฑ๋œ css์ด๋ฏ€๋กœ ๊ธฐ๋ณธ์ž‘์„ฑ๋‹จ์œ„์ธ class๋ฅผ ๋”ฐ๋ฅด๋Š”๋ฐ class์˜ ์ด๋ฆ„์€ Bootstrap์ด ๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋†“์€ ๊ฒƒ์ด๋ฏ€๋กœ ์ด๋ฆ„์„ ์ž˜ ๋ณด๊ณ  ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค

4.1 Todo ์ „์ฒด ์กฐํšŒ ๋ทฐ

Todo ๋ฐ์ดํ„ฐ๋ฅผ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋„˜๊ฒจ์„œ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•œ๋‹ค.

from .models import Todo

def todo_list(request):
	todos = Todo.objects.filter(complete=False)
    return render(request, 'todo/todo_list.html', {'todos':todos})

์™„๋ฃŒ๋˜์ง€์•Š์€ Todo๋งŒ ์ „์ฒด ๋ชฉ๋ก ํ™”๋ฉด์— ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด complete=False๋กœ ํ•„ํ„ฐ๋งํ•ด์ค€๋‹ค
todoํด๋”์•ˆ์— ์žˆ๋Š” todo_list.html๋กœ ํ™”๋ฉด์„ ๋„˜๊ฒจ์ค€๋‹ค


4.2 Todo ์ „์ฒด ์กฐํšŒ URL ์—ฐ๊ฒฐ

๋ฉ”์ธ ํŽ˜์ด์ง€์—์„œ Todo ์ „์ฒด ๋ชฉ๋ก์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด URL์„ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค. todo ํด๋” ์•ˆ์— ์žˆ๋Š” urls.py์— ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•œ๋‹ค.

from . import views

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

ํ˜„์žฌ ํด๋”์˜ views.py๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค
path์— ''๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด ๋ฉ”์ธํ™”๋ฉด์— todo_list๋ทฐ๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค

4.3 ํ”„๋กœ์ ํŠธ์— Todo ์ „์ฒด ์กฐํšŒ URL ์—ฐ๊ฒฐ

todo ์•ฑ URL์„ ํ”„๋กœ์ ํŠธ์˜ URL์— ์—ฐ๊ฒฐํ•ด์ค€๋‹ค. mytodoํด๋” ์•ˆ์— ์žˆ๋Š” urls.py์— ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•œ๋‹ค.

from django.urls import path, include

urlpatterns = [
	path('admin/', admin.site.urls),
    path('', include('todo.urls')),
]

๋ฉ”์ธํ™”๋ฉด(์ฒซ ํ™”๋ฉด)์— ์ „์ฒด ์กฐํšŒ ํ…œํ”Œ๋ฆฟ์ด ๋ณด์ด๋„๋ก ํ•œ๋‹ค


5. Todo ์ƒ์„ธ ์กฐํšŒ ๊ธฐ๋Šฅ

์šฐ๋ฆฌ๊ฐ€ todo๋ฅผ ๋“ฑ๋กํ•˜๋ฉด ๋ฉ”์ธํ™”๋ฉด์—๋Š” Todo์˜ title, ์ œ๋ชฉ์ด ๋ณด์ด๊ฒŒ๋œ๋‹ค. ์ด ์ œ๋ชฉ์„ ๋ˆŒ๋ €์„๋•Œ ์ด todo์˜ description, ์—…๋กœ๋“œํ•œ ๋‚ ์งœ, ๋ชฉ๋ก์œผ๋กœ ๋ฒ„ํŠผ์ด ์žˆ๋Š” ์ƒ์„ธ ์ •๋ณด๊ฐ€ ๋ณด์—ฌ์ง€๋„๋ก ์ƒ์„ธ ์กฐํšŒ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

5.1 Todo ์ƒ์„ธ ์กฐํšŒ ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ

๋จผ์ € ์ƒ์„ธ์กฐํšŒ ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ ๋‹ค. todoํด๋” ์•ˆ์— templates ํด๋” ์•ˆ์— todo ํด๋”์•ˆ์— todo_detail.html ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค.

<todo_detail.html>

<html>
    <head>
        <title>Todo List</title>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.1/font/boot-strap-icons.css">
    </head>
    <body>
        <div class="container">
            <h1>Todo Detail</h1>
            <div class="container">
                <div class="row">
                    <div class="col-md-12">
                        <div class="card">
                            <div class="card-body">
                                <h5 class="card-title">{{todo.title}}</h5>
                                <p class="card-text">{{todo.description}}</p>
                                <p style="float:right">{{todo.created}}</p>
                                <a href="{% url 'todo_list' %}" class="btn btn-primary">๋ชฉ๋ก์œผ๋กœ</a>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </body>
</html>

๋ชฉ๋ก์œผ๋กœ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„๋•Œ ๋ฉ”์ธํ™”๋ฉด์œผ๋กœ ๋‹ค์‹œ ๋„˜๊ฒจ์ง€๋„๋ก ํ…œํ”Œ๋ฆฟํƒœ๊ทธ๋ฅผ ์ด์šฉํ•ด name='todo_list'๋กœ ๋“ฑ๋ก๋œ url์„ ๋„˜๊ฒจ ํ•ด๋‹น๋ทฐ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค


5.2 Todo ์ƒ์„ธ ์กฐํšŒ ๋ทฐ ์ƒ์„ฑ

์„ ํƒ๋œ todo์˜ pk์ธ id๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Todo ๊ฐ์ฒด๋ฅผ ์ƒ์„ธ์กฐํšŒ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค. ์ฆ‰, ๋“ฑ๋กํ•ด๋†“์€ todo๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์„๋•Œ ์ƒ์„ธ์กฐํšŒ๋กœ ๋„˜๊ธธ todo๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜ pk๋ฅผ ์ด์šฉํ•œ๋‹ค.

def todo_detail(request, pk):
	todo = Todo.objects.get(id=pk)
    return render(request, 'todo/todo_detail.html', {'todo':todo})

todo = Todo.objects.get(id=pk)
todo ๋ณ€์ˆ˜์— Todo ๋ชจ๋ธ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ id๋กœ ๊ตฌ๋ถ„ํ•ด ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ์™€์„œ ์ €์žฅํ•œ๋‹ค


5.3 Todo ์ƒ์„ธ ์กฐํšŒ URL ์—ฐ๊ฒฐ

url์„ /pk/๋กœ ์„ค์ •ํ•ด์„œ ํ•ด๋‹นํ•˜๋Š” pk์˜ todo๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค.
todo ํด๋”์•ˆ์— ์žˆ๋Š” urls.py ํŒŒ์ผ์— ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค.

path('<int:pk>/', views.todo_Detail, name='todo_detail'),

pk๋Š” ์ •์ˆ˜ํ˜•์œผ๋กœ ๋ฐ›์•„์˜ค๊ธฐ์œ„ํ•ด int๋กœ ์ฃผ์—ˆ๋‹ค. pk๋Š” ๋ช‡๋ฒˆ์งธ todo์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜๋‹ค.

todo_list.html์—์„œ todo์˜ title์„ ํด๋ฆญํ•˜๋ฉด ์ƒ์„ธ ์กฐํšŒ ํŽ˜์ด์ง€๋กœ ๋„˜๊ฒจ์งˆ ์ˆ˜ ์žˆ๋„๋ก<a>ํƒœ๊ทธ ์•ˆ์— todo_detail url์„ ํ…œํ”Œ๋ฆฟ ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•ด ๋“ฑ๋กํ•ด์ค€๋‹ค.

<a href="{% url 'todo_detail' pk=todo.pk %}">{{todo.title}}</a>

todo์˜ title์„ ๋ˆ„๋ฅด๋ฉด todo_detail name์„ ๊ฐ€์ง„ url์„ ํ˜ธ์ถœํ•ด์„œ views.py์— ์žˆ๋Š” todo_detail ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. pk๋กœ ์–ด๋–ค todo์ธ์ง€ ๊ตฌ๋ถ„ํ•œ๋‹ค.


์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ์ด๋ฒˆ ํ™œ๋™๋•Œ ์ง„ํ–‰ํ•œ ๋‚ด์šฉ์ด๋‹ค!!! ์•„์ง๊นŒ์ง€๋Š” ์ €๋ฒˆ์— ์ง„ํ–‰ํ–ˆ๋˜ ํฌํ† ์•ฑ๊ณผ ๋งค์šฐ ๋น„์Šทํ•ด์„œ.... ๋‹ค๋“ค ์ง€๋ฃจํ•˜์‹œ์ง€์•Š์„๊นŒ.. ์‚ด์ง ๊ฑฑ์ •์ด๊ธดํ•œ๋ฐ..... ๊ทธ๋ž˜๋„ ๊ธฐ์ดˆ๋ฅผ ๋‹ค์งˆ์ˆ˜๋ก ๋” ์ข‹์ง€์•Š์„๊นŒ ์‹ถ์œผ๋‹ˆ...... ๊ทธ๋ž˜๋„ ๋‹ค์Œ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณ„์† ๋‚˜๊ฐ€์•ผํ•˜๋‹ˆ๊นŒ ํ˜ธ๋‹ค๋‹ฅ ์ง„ํ–‰ํ•ด์•ผ์ฅ...!!!

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