Django CRUDアプローチ(5)-テンプレート継承とアプリケーション分離


Templateの継承


base.htmlの作成

  • は、後で継承するすべてのhtmlの基礎であり、複数のページの共通部分に継承して使用する基礎である.プロジェクトフォルダのtemplatesフォルダにhtmlファイル
  • を作成する
  • base.すべてのページを実現するにはhtmlで共通のnavbarコード(ブートから取得)
  • が必要です.
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
        <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
        <title>BLOG</title>
        <style>
          body {
            text-align: center;
            }
        </style>
      </head>
      <body>
        <nav class="navbar navbar-expand-lg navbar-light bg-light">
       ... 생략 
        </nav>
        <div class = "container">
            {% block content %}
            {% endblock %}
        </div>
      </body>
    </html>
  • 重要情報:各ページに含まれるコンテンツを{%blockコンテンツ%}{%endblock%}に指定
    -{%block content%}{%endblock%}各ページの内容が挿入されます
  • settings.pyで指定

  • プロジェクトフォルダの設定.pyベース.djangoテンプレート
  • を識別するにはhtmlのパスを指定する必要があります.
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [
                'modelproject/templates' 
    * base.html이 들어있는, 프로젝트 폴더 내의 templates 폴더의 경로를 명시 *
            ],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]

    各ページでbase。htmlの内容を継承する

  • ページごとに繰り返されるコードはbaseです.htmlに含まれるため、ページのhtmlファイルには対応するコード
  • は必要ない.

  • * home.html *
    {% extends 'base.html' %} << base.html 상속
        {% block content %}
          <header>
            <h1>Blog</h1>
          </header>
    
          <h4><a href="{% url 'new' %}">새 글 작성하기</a></h4>
        
          {% for blog in blogs%}
            <h3>{{ blog.title }}</h3>
            {{ blog.writer}}</br>
            {{ blog.summary }}
            <a href="{% url 'detail' blog.id %}">...more</a>
            <a href="{% url 'delete' blog.id%}">Delete Post</a> 
          {%endfor %}
        {% endblock %}
  • base.htmlの{%blockコンテンツ%}{%endblock%}には、各ページの{%blockコンテンツ%}{%endblock%}に含まれるコード
  • が含まれる.
  • 結果:家.htmlベース.htmlで実装navbarは
  • を継承する.
  • は、他のページに同様に存在する.html
  • を継承

    アプリケーションの分離


    アプリケーション別urlの分離

  • 現在のプロジェクトフォルダのURL.pyファイルでは、blogアプリケーションで使用されるurl->コードをすべて管理するのが長く複雑になり、クリーンアップする必要があります.
  • まずapp(blog)フォルダにurlsを表示します.pyファイルを作成し、アプリケーションで使用するurl
  • を移動します.
    from django.urls import path
    from .views import * 
    
    app_name = 'blog' << blog 앱에서 쓰이는 url임을 명시
    
    urlpatterns = [
        path('<int:id>', detail, name='detail'),
        path('new/', new, name='new'),
        path('create/', create, name='create'),
        path('update/<int:id>', update, name="update"),
        path('delete/<int:id>', delete, name="delete"),
    ]

    プロジェクトフォルダのurls。pyで宣言

  • プロジェクトフォルダのURL.pyファイル
  • の変更
    from django.contrib import admin
    from django.urls import path, include # include 작업을 분리해서 앱의 urls.py로 넘겨준다
    import blog.views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', blog.views.home, name="home"),
        path('blog/', include('blog.urls')),
    ]
  • path(「blog/」,include(「blog.urls」):「http://127.0.0.1:8000/blog/←」の後からblogです.urls.「pyで定義したパスを含めます!」意味
    -http://127.0.0.1:8000/blog/detailhttp://127.0.0.1:8000/blog/updateわあ。等の形態
  • .

    各ページコードのurlを変更する

    {% extends 'base.html' %}
      {% block content %}
        <h1>Blog Project</h1>
        <h4><a href="{% url 'blog:new' %}">New Post</a></h4>
    
          {% for blog in blogs%}
          <div>
            <h3>{{ blog.title }}</h3>
            {{ blog.id }} <br />
            {{ blog.writer }} <br />
            {{ blog.summary }}
            <a href="{% url 'blog:detail' blog.id %}">...more</a>
          </div>
          {% endfor %}
      {% endblock %}
    
  • app nameをblogのurlリストnewとして変更し、detailがurlを要求する
  • urlリクエストを受信した場合は、まずプロジェクトフォルダのurlsに移動します.pyのurlpatternsで
  • と一致
  • 「blog/」で始まるリクエストの場合、blogアプリケーションフォルダのurls.pyマッチング