ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.