django

django crud

Posted by 동식이 블로그 on January 29, 2019

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

  • 인스턴스를 다른 인스턴스의 변수로 넣기