拡張実験-設計の最初のページ

10938 ワード

各アプリケーションの最初のページは作成されていますが、プロジェクトの最初のページのルート(/)URLの処理ロジックは開発されていません.

プロジェクトのトップページ


プロジェクトのナビゲーションで「プロジェクトホーム」プロジェクトをクリックしたときにエラーが発生したのは、プロジェクトのトップページのルート(/)URLに対する処理ロジックがないためです.
ろんりせっけい

UIデザイン

URLConf符号化


テーブルは変更されていないので、モデル符号化は必要ありません.
testsite/urlsは、アプリケーションのURLではなく、プロジェクトのURLです.ルート(/)URLとインポート文をpyファイルに追加するだけで、2行です.
    path('', views.HomeView.as_view(), name='home'),

Viewエンコーディング


前述のHomeView符号化.プロジェクトに関連するビューなのでtestsite/views.pyファイルにエンコードします.
from django.views.generic import TemplateView

# TemplateView
class HomeView(TemplateView):
    
    # TemplateView 제네릭 뷰를 상속받을 경우 template_name 필수
    # 템플릿 파일이 위치하는 디렉토리는 settings.py 파일의 
    # TEMPLATES 항목에 리스트 요소로 추가되어 있다.
    template_name = 'home.html'
    
    # 템플릿 시스템으로 넘겨줄 컨텍스트 변수는 
    # get_context_data() 메소드를 오버라이딩해서 정의
    def get_context_data(self, **kwargs):
        # get_context_data() 메소드 정의시 super() 메소드 호출 필수
        context = super().get_context_data(**kwargs)
        # testsite 프로젝트 하위에 있는 애플리케이션들의 리스트들을
        # 보여주기 위해 컨텍스트 변수 app_list에 담아서 
        # 템플릿 시스템에 넘겨준다.
        context['app_list'] = ['polls', 'books']
        return context

Templateコード


home.htmlテンプレートはプロジェクトテンプレートであるため、継承に使用する親テンプレートと同じ場所のディレクトリに作成されます.
{% extends 'base_books.html %}

{% block content %}
    <h2>shkim Django Application</h2>
    <ul>
        {% for appname in app_list %}
            {% with appname|add:":"|add:"index" as urlvar %}
                <li><a href="{% url urlvar %}">{{ appname }}</a></li>
            {% endwith %}
        {% endfor%}
    </ul>
{% endblock content %}
ビューからapp listコンテキスト変数を受信し、app listのappnameを画面に1つずつ表示します.
アプリケーション名をクリックすると、{%url urlvar%}タグを使用して接続するURLが抽出され、urlvarパラメータは{%with%}タグによって定義されます.
たとえば、アプリケーション名がbooksの場合、urlvarはbooks:インデックスになります.

apps.利用する


プロジェクトのすべてのプロジェクトを設定します:settings.py
各アプリケーションに必要なアイテムの場所:appsを設定します.py
アプリケーション別名の例を示します.pyファイル機能の利用
books/apps.pyファイルの変更
...

class BooksConfig(AppConfig):
	...
    verbose_name = 'Book-Author-Publisher App'
booksアプリケーションの設定クラスBooksConfigのプロパティの1つであるverbose nameを定義します.
testsite/views.pyファイルの変更
...
    def get_context_data(self, **kwargs):
        ...
        
        # 이 라인 대신 아래 5라인 추가
        # context['app_list'] = ['voting', 'books']
        dictVerbose = {}
        # apps 객체의 get_app_configs() 메소드를 호출하면
        # settings.py 파일의 INSTALLED_APPS에 등록된
        # 각 앱의 설정 클래스들을 담은 리스트를 반환
        for app in apps.get_app_configs():
            # app.path는 각 설정 클래스의 path 속성으로 
            # 애플리케이션의 물리적 경로를 뜻한다.
            # site-packages 문자열이 있으면 외부 앱이므로 제거
            if 'site-packages' not in app.path:
                # 설정 클래스의 label 속성값을 key로 
                # verbose_name 속성값을 value로 해서 dicVerbose 사전에 등록
                dictVerbose[app.label] = app.verbose_name
        # verbose_dict 컨텍스트 변수에 dictVerbose 사전 대입        
        context['verbose_dict'] = dictVerbose
        return context
tempaltes/home.htmlの変更
...
<!--    ul 부분을 수정   -->
    <ul>
        {% for key, value in verbose_dict.items %}
                <li><a href="{% url key|add:':index' %}">{{ value }}</a></li>
        {% endfor%}
    </ul>
{% endblock content %}
items()メソッドを呼び出して、ビューから渡されるコンテキスト変数verbose dict辞書を巡ります.
key:クラスのlabel属性値を設定する
value:クラスのverbose nameプロパティ値の設定

出典:Djangoで学ぶPythonネットワークプログラミング(ベース)-金錫勲