octotree 설치
- 트리구조로 좀 더 편리하게 볼 수 있음
__str__
- 단순히 객체 자체를 찍어주는 친구인데 오버라이드를 통해 이름을 출력하게 해줌
1
2
3
4
5
6
7
8
9
10
11
# models.py
from django.db import models
class Student(models.Model):
name = models.CharField(max_length=20)
email = models.CharField(max_length=50)
birthday = models.DateField()
age = models.IntegerField()
def __str__(self):
return self.name
###
Todo list - CRUD
기초 뼈대 만들기
1
2
3
# mysite urls.py
path("todos/", include("todo.urls"))
1
2
3
4
5
6
7
8
# todo라는 app안에 urls.py 생성
from django.urls import path
from . import views
urlpatterns = [
path("", views.index),
# todos/
]
1
2
3
4
5
# todo views.py
from django.shortcuts import render
def index(request):
return render(request, "todo/index.html")
1
2
# todo 안에 templates폴더 생성하고 그 안에 todo폴더 하나 더 만들고 거기에 index.html
# base.html을 만들고 그거를 extends
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# base.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Todoapp</title>
</head>
<body>
{% block bodyblock %}
{% endblock %}
</body>
</html>
1
2
3
4
5
6
7
# index.html
{% extends "todo/base.html" %}
{% block bodyblock %}
<h1>여기는 인덱스</h1>
{% endblock %}
모델링
1
2
3
4
5
6
7
8
9
10
# todo models.py
from django.db import models
class Todo(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
due_date = models.DateField()
def __str__(self):
return self.title
1
2
3
# 데이터베이스 구조 만들기
$ python manage.py makemigrations
$ python manage.py migrate
1
2
3
4
5
# todo admin.py
from django.contrib import admin
from .models import Todo
admin.stie.register(Todo)
생성(post) - create
1
2
# todo urls.py
path("new/", views.new),
1
2
3
# todo views.py
def new(request):
return render(request, "todo/new.html")
1
2
3
4
5
6
7
8
9
10
11
12
# new.html 생성
{% extends "todo/base.html" %}
{% block bodyblock %}
<form action="/todos/create/" method="post">
{% csrf_token %}
<input type="text" name="title"/>
<input type="text" name="content"/>
<input type="date" name="due_date"/>
<input type="submit" value="Submit"/>
</form>
{% endblock %}
1
2
# todo urls.py
path("create/", views.create),
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# todo views.py
# 받아온 데이터를 가져오고, 데이터베이스에 저장
def create(request):
title = request.POST.get("title")
content = request.POST.get("content")
due_date = request.POST.get("due_date")
todo = Todo(title=title, content=content, due_date=due_date)
todo.save()
## 위 두줄을 줄인 형태
#Todo.objects.create(title=title, content=content, due_date=due_date)
return redirect("/todos")
1
2
3
# mysite setting.py
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
읽기 - read
1
2
3
4
5
# todo views.py
## index페이지에 전체 내용이 나오게 추가해줌
def index(request):
todos = Todo.objects.all()
return render(request, "todo/index.html", {"todos":todos})
1
2
3
4
5
6
# index.html
{% for todo in todos %}
<h3></h3>
<p></p>
<hr>
{% endfor %}
1
2
# todo views.py
todos = Todo.objects.order_by("due_date").all()
1
2
3
# todo urls.py
## variable routing
path("<int:id>/", views.read),
1
2
3
4
5
# todo views.py
def read(request, id):
todo = Todo.objects.get(pk=id)
return render(request, "todo/read.html",{"todo":todo})
1
2
3
4
5
6
7
8
9
# read.html
## read.html에 전체내용 추가
{% extends "todo/base.html" %}
{% block bodyblock %}
<h1></h1>
<h3></h3>
<h4></h4>
{% endblock %}
1
2
3
4
5
6
# index.html
## 누르면 read.html로 넘어가는 a태그 추가
<a href="/todos//">할일보기</a>
or
<a href="/todos//">할일보기</a>
지우기 - delete
1
2
# todo urls.py
path("<int:id>/delete/", views.delete),
1
2
3
4
5
6
7
# todo views.py
## 삭제 후 index페이지로
def delete(request, id):
todo = Todo.objects.get(pk=id)
todo.delete()
return redirect("/todos")
1
2
3
# read.html 에 삭제버튼 만들기
## 삭제 확인 메세지까지
<a href="/todos//delete/">삭제</a>
수정하기 - update
1
2
3
# todo urls.py
path("<int:id>/edit/", views.edit),
path("<int:id>/update/", views.update),
1
2
3
4
5
6
# todo views.py
## 사용자에게 수정을 위한 정보를 불러다주는..
def edit(request, id):
todo = Todo.objects.get(pk=id)
return render(request, "todo/edit.html", {"todo":todo})
1
2
3
4
5
6
7
8
9
10
11
12
# edit.html 생성
{% extends "todo/base.html" %}
{% block bodyblock %}
<form action="/todos//update/" method="post">
{% csrf_token %}
<input type="text" name="title" value=""/>
<input type="text" name="content" value=""/>
<input type="date" name="due_date" value=""/>
<input type="submit" value="Submit"/>
</form>
{% endblock %}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# todo views.py
## 수정된 내용을 update하는 내용
def update(request, id):
todo = Todo.objects.get(pk=id)
title = request.POST.get("title")
content = request.POST.get("content")
due_date = request.POST.get("due_date")
# 수정된 내용을 원본에 저장
todo.title = title
todo.content = content
todo.due_date = due_date
todo.save()
return redirect(f"/todos/{id}/")
1
2
# read.html에 수정버튼 달기
<a href="/todos//edit/">수정</a>
Class 연습
pokemon.py
- 인스턴스를 다른 인스턴스의 변수로 넣기