-
Django Model & View 만들기(실습)Python/Django 2022. 9. 28. 09:08
모델만들기
# models.py from django.db import models class Post(models.Model): title = models.CharField(max_length=100) content = models.TextField()
# python manage.py makemigrations 앱이름 # python manage.py migrate app yunajoe@yunajoe MINGW64 ~/workspace/mydjango01 (master) $ python manage.py makemigrations app Migrations for 'app': app\migrations\0001_initial.py - Create model Post yunajoe@yunajoe MINGW64 ~/workspace/mydjango01 (master) $ python manage.py migrate app Operations to perform: Apply all migrations: app Running migrations: Applying app.0001_initial... OK
# 아래처럼 model를 생성한 것 과 같다 yunajoe@yunajoe MINGW64 ~/workspace/mydjango01 (master) $ python manage.py sqlmigrate app 0001 BEGIN; -- -- Create model Post -- CREATE TABLE "app_post" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(100) NOT NULL, "content" text NOT NULL); COMMIT;
모델을 등록해주자# admin.py ==> 모델등록 from django.contrib import admin from app.models import Post # Register your models here. admin.site.register(Post)
admin 에다 Post 모델을 등록했기 때문에 아래와 같이 나온다
글을 작성해보고!DB을 열어보면?!
현재의 DB는 SQLite3이지만, 다른 DB ( MySql, MariaDB, PostgreSQL, etc..)등도 연결 가능하다
view 만들기# urls.py from django.contrib import admin from django.urls import path from app import views urlpatterns = [ path("admin/", admin.site.urls), path("app/", views.index), ] # views.py from django.http import HttpRequest, HttpResponse from django.shortcuts import render from app.models import Post def index(request: HttpRequest) -> HttpResponse: return HttpResponse( """ <html> <style> body{background-color: blue;} </style> <body> <h1>Hello World</h1> </body> </html> """ )
+ 하나의 jangoproject에는 다수의 django앱이 있을 수 있고 앱마다 views가 있을 테니까 views 이름이 겹치지 않도록 as 별칭 으로도 할 수 있다 from app import views as app_views urlpatterns = [ path("admin/", admin.site.urls), path('app/', app_views.index) ]
template폴더를 만들기(아래처럼 templates/앱이름/html파일이름)# views.py def index(request: HttpRequest) -> HttpResponse: return render(request, "app/index.html") # index.html <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <h1>안뇽!</h1> </body> </html>
데이터를 views.py에 직접 하드코딩하여 불러와보자
# views.py def index(request: HttpRequest) -> HttpResponse: qs = [ {"id": 1, "title": "굿모닝"}, {"id": 2, "title": "굿나잇"}, ] return render( request, "app/index.html", { "post_list": qs, }, ) # index.html <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <h1>PostList</h1> {% for post in post_list %} <div> {{ post.id }} : {{ post.title}} </div> {% endfor %} </body> </html>
데이터를 모델를 통해서 불러와보자views.py from django.http import HttpRequest, HttpResponse from django.shortcuts import render from app.models import Post def index(request: HttpRequest) -> HttpResponse: qs = Post.objects.all() return render( request, "app/index.html", { "post_list": qs, }, ) # index.html <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <h1>PostList</h1> {% for post in post_list %} <div> {{ post.id }} : {{ post.title}} </div> {% endfor %} </body> </html>
DB에 있는 데이터 실습
http://127.0.0.1:8000/app/1 로 접근하면 id=1인 포스팅 내용이 보여지고 http://127.0.0.1:8000/app/2 로 접근하면 id=2인 포스팅 내용이 보여지게 만들기
# views.py def post_detail(request: HttpRequest, pk: int) -> HttpResponse: post = Post.objects.get(pk=pk) return render( request, "app/post_detail.html", {"each_post": post}, )
templates/app/post_detail.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>Post Detail: {{ each_post.title }}</h1> {{ each_post.content }} </body> </html>
urls.py from django.contrib import admin from django.urls import path from app import views urlpatterns = [ path("admin/", admin.site.urls), path("app/", views.index), path("app/<int:pk>", views.post_detail), ]
http://127.0.0.1:8000/app/1
http://127.0.0.1:8000/app/2
http://127.0.0.1:8000/app/3 (pk=3 은 포스팅이 없다)
page가 없을 때는 404로 표시해주자
def post_detail(request: HttpRequest, pk: int) -> HttpResponse: # post = Post.objects.get(pk=pk) post = get_object_or_404(Post, pk=pk) return render( request, "app/post_detail.html", {"each_post": post}, )
출처: 본 포스팅은 "인프런의 장고 설계철학으로 시작하는 파이썬 장고 입문" 을 토대로 작성하였습니다
'Python > Django' 카테고리의 다른 글
템플릿(Template) & 실습 (0) 2022.10.07 URL 설계 (1) 2022.10.07 Django 요청처리 (0) 2022.09.28 Python 문법 엿보기 (0) 2022.09.26 Django시작하기 (1) 2022.09.21