3.1 Todo ๋ชฉ๋ก ์น ์๋น์ค ์์ํ๊ธฐ
์ฅ๊ณ ๋ฅผ ํ์ฉํด ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ด๋ฉฐ ์ค์ํ Todo ๋ชฉ๋ก ์น ์๋น์ค ์์ ๋ฅผ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
3.1.1 ํ๋ก์ ํธ ๊ธฐ๋ฅ ์ ๋ฆฌํ๊ธฐ
Todo๋ชฉ๋ก ์๋น์ค๋ CRUD๋ก ๋ถ๋ฆฌ๋, ๋ฐ์ดํฐ ๊ด๋ จ ์ฒ๋ฆฌ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๋ชจ๋ ํฌํจ ๋ฐ ์ง๊ด์ ์ด๊ณ ๊ฐ๋จ
์ดํ DRF๋ฅผ ๊ณต๋ถํ ๋ค์์ ๋๊ฐ์ ํ๋ก์ ํธ๋ฅผ DRF ๋ฒ์ ์ผ๋ก ๊ฐ๋ฐํด๋ณผ ๊ฒ์ ๋๋ค.
3.1.2 ํ๋ก์ ํธ ์์ฑํ๊ธฐ
๊ฐ์ํ๊ฒฝ ์ธํ
์ฅ๊ณ ์ค์น
์ฅ๊ณ ํ๋ก์ ํธ ์์ฑ
todo ์ฑ ์์ฑ
3.1.4 Todo ํ๋ก์ ํธ ์ค์ ํ๊ธฐ
๊ธฐ๋ณธ์ ์ธ ์ค์ ๋จผ์ ์งํํ๊ฒ ์
todo ์ฑ์ ์์ฑํ์ผ๋ฏ๋ก settings.py์ ์ฑ์ ์ถ๊ฐํ๊ฒ ์
๋ง์ง๋ง์ผ๋ก
๋ง์ด๊ทธ๋ ์ดํธ๋ฅผ ํด์ค ๋ค,
๊ด๋ฆฌ์ ๊ณ์ ์ ์์ฑํ๊ฒ ์ต๋๋ค.
3.1.4 Todo ๋ชจ๋ธ ์์ฑํ๊ธฐ
ํ๋ก์ ํธ์ ์ฒซ ๋จ๊ณ๋ ์ธ์ ๋ ๋ชจ๋ธ์ ์์ฑํ๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์์ฑํ ๋ชจ๋ธ์ ํ๋๋ฅผ ์๊ฐํด๋ณด๋ฉด
1. title : Todo์ ์ ๋ชฉ
2. description : Todo์ ๋ํ ์ค๋ช
3. created : Todo ์์ฑ ์ผ์
4. complete : Todo ์๋ฃ ์ฌ๋ถ
5. important : Todo ์ค์ ์ฌ๋ถ
๋ชจ๋ธ์ ๊ตฌํํ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
todo ๋ฐ์ ๋ฐ๋ก ์๋ models.py ํ์ผ์ ์ ๋ ๊ฒ์ด๋ค!
์์ฑ์ผ์ ์๋์ผ๋ก ์ถ๊ฐ๋๋๋ก ์ค์ ํ์์ต๋๋ค.
์ฅ๊ณ ๊ฐ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ pk์ธ id ํ๋๋ ํฌํจ๋์ด ์์์ ์ผ๋์ ๋์ด์ผ ํฉ๋๋ค.
์ดํ์ ์ฐ๋ฆฌ๋ id ๊ฐ์ pk๋ก ํ์ฉํ์ฌ Todo ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋ถํ ์์ ์ ๋๋ค.
์ด์ ๋ชจ๋ธ์ ๋ํ ๋ง์ด๊ทธ๋ ์ด์ ์ ์งํํ๊ฒ ์ต๋๋ค.
ํ๋ก์ ํธ ์์ฑ ํ ์ต์ด์ ๋ง์ด๊ทธ๋ ์ด์ ์ด๋ฏ๋ก ๊ธฐ๋ณธ ๋ชจ๋ธ๊น์ง
๋ง์ด๊ทธ๋ ์ด์ ๋ ์ ์๋๋ก ์ฑ์ ์ง์ ํ์ง ์๊ฒ ์ต๋๋ค.
๋ชจ๋ธ์ ๋ง๋ค์์ผ๋ ๊ด๋ฆฌ์ ํ์ด์ง์์ ํ์ธํ ์ ์์ด์ผ ํ ๊ฒ์ ๋๋ค.
todo/admin.py์์ Todo ๋ชจ๋ธ์ ๋ฑ๋กํฉ๋๋ค.
๊ด๋ฆฌ์ ํ์ด์ง์ ์ ์ํ๋ ค๋ฉด url์ด ์ค์ ๋์ด์ผ ํฉ๋๋ค.
mytodo/urls.py์์ path๊ฐ ์ ์ค์ ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๊ธฐ๋ฅ์ ๊ตฌํํ ์ค๋น๊ฐ ๋์์ต๋๋ค.
3.2 Todo ์ ์ฒด ์กฐํ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ
์ฒซ๋ฒ์ฌ ๊ธฐ๋ฅ์ Todo ์ ์ฒด ์กฐํ ๊ธฐ๋ฅ์ ๋๋ค.
3.2.1 Todo ์ ์ฒด ์กฐํ ๊ธฐ๋ฅ ์ปจ์
์ฒซ๋ฒ์งธ ํ์ด์ง์ธ Todo ์ ์ฒด ์กฐํ ๊ธฐ๋ฅ์์๋ ์๋ฃ๋์ง ์์ Todo๋ง ๋ณด์ฌ์ฃผ๋๋ก ๊ตฌํํ๊ฒ ์ต๋๋ค.
3.2.2 Bootstrap์ผ๋ก ์ข ๋ ๋ฉ์ง ํ ํ๋ฆฟ ๋ง๋ค๊ธฐ
๋ถํธ์คํธ๋ฉ์ ๊ฐ์ฅ ์ ๋ช ํ๊ณ ์ค๋๋ CSSํ๋ ์์ํฌ์ ๋๋ค.
3.2.3 Todo ์ ์ฒด ์กฐํ ํ ํ๋ฆฟ ๋ง๋ค๊ธฐ
์์ ์์๋ ์์ ์์ ์ ๋์ผํ๊ฒ ํ ํ๋ฆฟ -> ๋ทฐ -> url ์์๋ก ์งํํ๊ฒ ์ต๋๋ค.
<html>
<head>
<title>Todo ๋ชฉ๋ก ์ฑ</title>
<link
rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
/>
<link rel="stylesheet" href="https://cdn.jsdeliver.net/npm/bootstrap-iocons@1.7.1/font/boot-strap-icons.css">
</head>
<body>
<div class="container">
<h1>Todo ๋ชฉ๋ก ์ฑ</h1>
<p>
<a href=""><i class="bi-plus"></i>Add Todo</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-outline-primary">์์ ํ๊ธฐ</a>
</div>
</li>
{% endfor %}
</ul>
</div>
</body>
</html>
์์ ๊ฒ๊ณผ ๋๊ฐ์ง ์ฐจ์ด์ ์ด ์์ต๋๋ค.
1. head ์์ <link>ํ๊ทธ๊ฐ ์๊ณ ์ฌ๊ธฐ์์ ๋ถํธ์คํธ๋ฉ์ ๋ถ๋ฌ์ต๋๋ค.
2. ๊ฐ ํ๊ทธ๋ง๋ค class ๋ผ๋ ๊ฒ์ ์์ฑํ๊ณ ์์ต๋๋ค.
1๋ฒ์ Bootstrap์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ถ๋ฌ์ค๋ ์ฝ๋์ ๋๋ค.
๋ถํธ์คํธ๋ฉ์ ์ฌ์ฉํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ 2๊ฐ์ง์ธ๋ฐ,
์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ์ bootstrap ํํ์ด์ง์์ cssํ์ผ๋ค์ ๋ฐ์์ ํ๋ก์ ํธ ํด๋์ ์ง์ด๋ฃ๋ ๋ฐฉ์
๋๋ฒ์งธ ๋ฐฉ๋ฒ์ ์น ๋งํฌ ํํ๋ก ์ ๊ณต๋๋ cssํ์ผ์ ๊ฐ์ ธ๋ค ์ฐ๋๋ก ์ฐธ์กฐ์ํค๋ ๋ฐฉ์
3.2.4 Todo ์ ์ฒด ์กฐํ ๋ทฐ ๋ง๋ค๊ธฐ
๋ค์์ ๋ทฐ ์ ๋๋ค. Todo ๋ฐ์ดํฐ๋ฅผ ํ ํ๋ฆฟ์ผ๋ก ๋๊ฒจ์ฃผ๋ ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์์ต๋๋ค.
์ด๋ ์๋ฃ๋์ง ์์ Todo๋ง ์ ๋ฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ complete = False ์ต์ ์ผ๋ก ํํฐ๋งํด์ผ ํฉ๋๋ค.
์๋ฃ๋์ง ์์ Todo๋ง ์ ๋ฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ complete =False ์ต์ ์ผ๋ก ํํฐ๋งํด์ผํจ
3.2.5 Todo ์ ์ฒด ์กฐํ URL ์ฐ๊ฒฐํ๊ธฐ
๋ง์ง๋ง ๋จ๊ณ๋ url์ ์ฐ๊ฒฐํ๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๋ ๋ฉ์ธ ํ์ด์ง์์ Todo๋ชฉ๋ก์ ๋ณด์ฌ์ค ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฃผ์์ todo_list๋ทฐ๋ฅผ ์ฐ๊ฒฐํ๊ฒ ์ต๋๋ค.
path('', views.todo_list, name='todo_list')๋ฅผ ์ฌ์ฉํ์ฌ ๋ฃจํธ ๊ฒฝ๋ก('')์ ๋ํ ์์ฒญ์ views.todo_list ํจ์์ ์ฐ๊ฒฐํฉ๋๋ค. ์ด๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฃจํธ URL์ ๋ฐฉ๋ฌธํ์ ๋ todo_list ํจ์๊ฐ ํธ์ถ๋์ด ์คํ๋จ์ ์๋ฏธํฉ๋๋ค.
๋ํ ์์ ์์ฑํ todo ์ฑ์ ํ๋ก์ ํธ url์ ์ฐ๊ฒฐํด์ผํฉ๋๋ค.
mytodo/urls.py์ todo.urls๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ฐ๊ฒฐํฉ๋๋ค.
path('todo/', include('todo.urls'))๋ฅผ ์ฌ์ฉํ์ฌ '/todo/' ๊ฒฝ๋ก์ ๋ํ ์์ฒญ์ 'todo.urls'๋ก ์ฐ๊ฒฐํฉ๋๋ค. ์ด๋ 'todo' ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ์๋ URL ํจํด์ ์ฌ์ฉํ๊ธฐ ์ํ ์ค์ ์ ๋๋ค. 'todo.urls'๋ 'todo' ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์์ URL ํจํด์ ์ ์ํ๋ ๋ชจ๋์ ๊ฒฝ๋ก๋ฅผ ๋ํ๋ ๋๋ค.
์ฒซ๋ฒ์งธ ๊ธฐ๋ฅ์ธ Todo ์ ์ฒด ์กฐํ ๊ธฐ๋ฅ์ด ๊ตฌํ ์๋ฃ๋์์ต๋๋ค!
3.3 Todo ์์ธ ์กฐํ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ
3.3.1 Todo ์์ธ ์กฐํ ๊ธฐ๋ฅ ์ปจ์
์์ธ ์กฐํ ๊ธฐ๋ฅ์ Todo๋ฅผ ์ ํํ์ ๋ ์กฐํํ ์ ์๋ ๊ธฐ๋ฅ์ผ๋ก,
Todo ์ ๋ชฉ๊ณผ ์ค๋ช ์ ๋ํ๋ด๋๋ก ๊ตฌํํ ๊ฒ์ ๋๋ค.
3.3.2 Todo ์์ธ ์กฐํ ํ ํ๋ฆฟ ๋ง๋ค๊ธฐ
์ฒซ ๋จ๊ณ๋ ํ ํ๋ฆฟ์ ๋๋ค. ์์ ๋ง๋ค์๋ ํ ํ๋ฆฟ๊ณผ ๋์ผํ๊ฒ ๋ถํธ์คํธ๋ฉ ํ์ฉ ํ ๊ฒ.
Todo ์ ๋ชฉ๊ณผ ์ค๋ช ์ ๋ณด์ฌ์ค ๊ฒ์ด๋ฉฐ ๋ชฉ๋ก์ผ๋ก ๋ค์ ๋์๊ฐ ์ ์๋๋ก ๋ฒํผ์ ๋ง๋ค๊ฒ ์ต๋๋ค.
<html>
<head>
<title>TODO ๋ชฉ๋ก ์ฑ</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/bootstrap-icons.css">
</head>
<body>
<div class="container">
<h1>TODO ์์ธ๋ณด๊ธฐ</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>
</h5>
<p class="card-text">{{ todo.description }}</p>
<a href="{% url 'todo_list' %}" class="btn btn-primary">๋ชฉ๋ก์ผ๋ก</a>
</div>
</div>
</div>
</div>
</div>
</body>
</div>
</html>
3.3.3 Todo ์์ธ ์กฐํ ๋ทฐ ๋ง๋ค๊ธฐ
๋ค์ ๋จ๊ณ๋ ๋ทฐ์ ๋๋ค.
์ ํ๋ Todo์ pk์ธ Id๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Todo๊ฐ์ฒด๋ฅผ ์ฐพ์
todo_detail.html๋ก ์ ๋ฌํ ์ ์๋๋ก ์์ฑํ๊ฒ ์ต๋๋ค.
3.3.4 Todo ์์ธ ์กฐํ URL ์ฐ๊ฒฐํ๊ธฐ
๋ง์ง๋ง์ผ๋ก url์ ์ฐ๊ฒฐํ๊ฒ ์ต๋๋ค.
url์ /pk/๋ก ์ค์ ํ์ฌ ํด๋น Todo๋ฅผ ์ฐ๊ฒฐํ ์ ์๋๋ก ํ๊ฒ ์ต๋๋ค.
path('<int:pk>/', views.todo_detail, name='todo_detail'):
- <int:pk>๋ ์ ์ ํ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ํ๋ ๋๋ค. ์ด ๋ถ๋ถ์ URL์์ ์ซ์ ๊ฐ์ ๋ฐ์์์ pk๋ผ๋ ๋ณ์์ ์ ์ฅํฉ๋๋ค.
- /์ซ์/ ํํ์ URL์ ๋ํ ํจํด์ ์ ์ํฉ๋๋ค.
- views.todo_detail ํจ์๋ฅผ ํธ์ถํ์ฌ ํด๋น pk ๊ฐ์ ํด๋นํ๋ ํ ์ผ์ ์์ธ ์ ๋ณด ํ์ด์ง๋ฅผ ํ์ํฉ๋๋ค.
- name='todo_detail'๋ ์ด URL ํจํด์ ๋ํ ์ด๋ฆ์ 'todo_detail'๋ก ์ง์ ํฉ๋๋ค. ์ด ์ด๋ฆ์ URL ์ญ์ฐธ์กฐ๋ฅผ ํตํด ํด๋น URL์ ์ฐธ์กฐํ ๋ ์ฌ์ฉ๋ฉ๋๋ค
3.4 Todo ์์ฑ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ
3.4.1 Todo ์์ฑ ๊ธฐ๋ฅ ์ปจ์
Todo ์์ฑ์ ์ ๋ชฉ, ์ค๋ช , ์ค์๋๋ฅผ ์ ๋ ฅํด์ผํ๊ธฐ ๋๋ฌธ์ ์ ๋ ฅ ํผ์ด ํ์ํฉ๋๋ค.
๋ฐ๋ผ์ ์๊น ๋ง๋ค์ด๋์ todo/forms.py์ ๋ด์ฉ์ ์์ฑํ ๊ฒ์ ๋๋ค.
3.4.2 Todo ์์ฑ ํ ํ๋ฆฟ ๋ง๋ค๊ธฐ
todo/forms.py์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ด์ฉ์ ์์ฑํฉ๋๋ค.
ํผ์ ํ์ฉํ์ฌ ํ ํ๋ฆฟ์ ์์ฑํ๊ฒ ์ต๋๋ค.
์์ ๋ง๋ ํผ์ forms.as_P์ ํํ๋ก ์์ฑํ๋ฉด ํ๊ทธ ๊ผด๋ก ํ ํ๋ฆฟ์ ํผ์ด ์์ฑ๋ฉ๋๋ค.
<html>
<head>
<title>TODO ๋ชฉ๋ก ์ฑ</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/bootstrap-icons.css">
</head>
<body>
<div class="container">
<h1>TODO ์ถ๊ฐํ๊ธฐ</h1>
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-body">
<form method="POST">
{% csrf_token %} {{ form.as_p }}
<button type="submit" class="btn btn-primary">๋ฑ๋ก</button>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</div>
</html>
3.4.3 Todo ์์ฑ ๋ทฐ ๋ง๋ค๊ธฐ
Todo๋ฅผ ์์ฑํ๊ธฐ ์ํ ๋ทฐ๋ POST์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ด์ผ ํฉ๋๋ค.
POST ์์ฒญ์ด ๋ค์ด์์ ๋๋ ํผ์ ๊ฒ์ฆํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋๋ก ํ๋ฉฐ,
GET ์์ฒญ์ด ๋ค์ด์์ ๋๋ ํผ์ ํฌํจํ ํ ํ๋ฆฟ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ฉด ๋ฉ๋๋ค.
- if request.method == "POST": ์กฐ๊ฑด๋ฌธ์ผ๋ก POST ์์ฒญ์ธ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- TodoForm(request.POST)์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ํผ์ ์ธ์คํด์คํํฉ๋๋ค.
- form.is_valid()๋ฅผ ์ฌ์ฉํ์ฌ ํผ์ด ์ ํจํ์ง ํ์ธํฉ๋๋ค. ์ ํจ์ฑ ๊ฒ์ฌ๋ ํ๋ ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ ๋ชจ๋ธ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค.
- ํผ์ด ์ ํจํ ๊ฒฝ์ฐ, form.save(commit=False)๋ฅผ ์ฌ์ฉํ์ฌ Todo ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํฉ๋๋ค. commit=False๋ ์์๋ก ์ ์ฅํ๊ณ ๋์ค์ ๋๋น์ ์ ์ฅํ ๊ฒ์์ ๋ํ๋ ๋๋ค.
- todo.save()๋ฅผ ํธ์ถํ์ฌ Todo ๊ฐ์ฒด๋ฅผ ๋๋น์ ์ ์ฅํฉ๋๋ค.
- return redirect('todo_list')๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ Todo๋ฅผ ํ์ธํ ์ ์๋ ํ ์ผ ๋ชฉ๋ก ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธํฉ๋๋ค.
3.4.4 Todo ์์ฑ URL ์ฐ๊ฒฐํ๊ธฐ
์ด์ url์ ์ฐ๊ฒฐํ๋ฉด ์๋ฃ๋ฉ๋๋ค.
3.5 Todo ์์ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ
3.5.1 Todo ์์ ๊ธฐ๋ฅ ์ปจ์
์์ฑ๊ธฐ๋ฅ๊ณผ ๊ฑฐ์ ๋์ผํฉ๋๋ค. ์์ฑ๊ณผ์ ์ฐจ์ด์ ์ ํผ์ ์ด๋ฏธ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฅ๋์ด ์๋ค๋ ๊ฒ ๋ฟ
๋ฐ๋ผ์ ์์ ๊ธฐ๋ฅ์ ๋ง๋ค๋๋ ์์ฑ ๊ธฐ๋ฅ๊ณผ ๋์ผํ๊ฒ ์์ฑํ๋,
๊ธฐ์กด Todo ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ ํจ๊ป ํฌํ๋ฆฟ์ผ๋ก ๋ณด๋ด๋ ๊ฒ๋ง ๊ตฌํํ๋ฉด ๋ฉ๋๋ค.
3.5.2 Todo ์์ ๋ทฐ ๋ง๋ค๊ธฐ
์์ฑ๊ณผ ๋์ผํ ํ ํ๋ฆฟ ์ฌ์ฉ, ํผ๋ ๋์ผํ๊ฒ ์ฌ์ฉํ๋ฉด ๋จ
๋ฐ๋ก ๋ทฐ๋ฅผ ์์ฑํ๋ฉด ๋๋๋ฐ,
๋ทฐ์์๋ ์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ ํผ์ ๊ธฐ์กด Todo ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ผํจ
def todo_edit(request, pk):
todo = Todo.objects.get(id=pk)
if request.method == "POST":
form = TodoForm(request.POST, instance=todo)
if form.is_valid():
todo = form.save(commit=False)
todo.save()
return redirect('todo_list')
else:
form = TodoForm(instance=todo)
return render(request, 'todo/todo_post.html', {'form': form})
3.5.3 Todo ์์ URL ์ฐ๊ฒฐํ๊ธฐ
3.6 Todo ์๋ฃ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ
3.6.1 Todo ์๋ฃ ๊ธฐ๋ฅ ์ปจ์
1. ์๋ฃ ๋ฒํผ ๋๋ ์ ๋ True๋ก ์ค์ ํด์ฃผ๋ ๊ธฐ๋ฅ
2. ์๋ฃ๋ Todo๋ง ํํฐ๋ง ํ๋ ค ๋ณผ ์ ์๋๋ก ํ๋ ๊ธฐ๋ฅ
3.6.2 Todo ์๋ฃ ํ ํ๋ฆฟ ๋ง๋ค๊ธฐ
<html>
<head>
<title>TODO ๋ชฉ๋ก ์ฑ</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/bootstrap-icons.css">
</head>
<body>
<div class="container">
<h1>DONE ๋ชฉ๋ก</h1>
<p>
<a href="{% url 'todo_list' %}" class="btn btn-primary">ํ์ผ๋ก</a>
</p>
<ul class="list-group">
{% for done in dones %}
<li class="list-group-item">
<a href="{% url 'todo_detail' pk=done.pk %}">{{ done.title }}</a>
{% if done.important %}
<span class="badge badge-danger">!</span>
{% endif %}
</li>
{% endfor %}
</ul>
</body>
</div>
</html>
3.6.3 Todo ์๋ฃ ๋ทฐ ๋ง๋ค๊ธฐ
def done_list(request):
dones = Todo.objects.filter(complete=True)
return render(request, 'todo/done_list.html', {'dones': dones})
def todo_done(request, pk):
todo = Todo.objects.get(id=pk)
todo.complete = True
todo.save()
return redirect('todo_list')
Todo ์๋ฃ URL ์ฐ๊ฒฐํ๊ธฐ
๋ง์ง๋ง์ผ๋ก url์ ์ฐ๊ฒฐํ๊ฒ ์ต๋๋ค.
๊ฐ๊ฐ done/, done// ํํ๋ก ์ง์ ํด์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
https://link.coupang.com/a/UtLyC
๋ฐฑ์๋๋ฅผ ์ํ Django REST Framework with ํ์ด์ฌ
COUPANG
www.coupang.com
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
'๐ฆ๋ฉ์์ด ์ฌ์์ฒ๋ผ 11๊ธฐ > ๋ฐฑ์๋๋ฅผ ์ํ Django Rest Framework' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Chapter 4 - 4.2 Django REST Framework ํ๋ก์ ํธ ๊ตฌ์กฐ ์ดํด๋ณด๊ธฐ (0) | 2023.04.13 |
---|---|
Chapter4 Django REST Framework ์ปจ์ ์ตํ๊ธฐ (0) | 2023.04.10 |
2.6.2 ์ฌ์ง ๊ฒ์๋ฌผ ๋ณด๊ธฐ ํ๋ฉด ๋ง๋ค๊ธฐ (0) | 2023.04.04 |
2.4 Django Template ์์๋ณด๊ธฐ (0) | 2023.04.02 |
2.1.3 ํ๋ก์ ํธ ์์ํ๊ธฐ (0) | 2023.03.30 |