拡張実験-設計の最初のページ
10938 ワード
各アプリケーションの最初のページは作成されていますが、プロジェクトの最初のページのルート(/)URLの処理ロジックは開発されていません.
プロジェクトのナビゲーションで「プロジェクトホーム」プロジェクトをクリックしたときにエラーが発生したのは、プロジェクトのトップページのルート(/)URLに対する処理ロジックがないためです.
ろんりせっけい
UIデザイン
テーブルは変更されていないので、モデル符号化は必要ありません.
testsite/urlsは、アプリケーションのURLではなく、プロジェクトのURLです.ルート(/)URLとインポート文をpyファイルに追加するだけで、2行です.
前述のHomeView符号化.プロジェクトに関連するビューなのでtestsite/views.pyファイルにエンコードします.
home.htmlテンプレートはプロジェクトテンプレートであるため、継承に使用する親テンプレートと同じ場所のディレクトリに作成されます.
アプリケーション名をクリックすると、{%url urlvar%}タグを使用して接続するURLが抽出され、urlvarパラメータは{%with%}タグによって定義されます.
たとえば、アプリケーション名がbooksの場合、urlvarはbooks:インデックスになります.
プロジェクトのすべてのプロジェクトを設定します:settings.py
各アプリケーションに必要なアイテムの場所:appsを設定します.py
アプリケーション別名の例を示します.pyファイル機能の利用
books/apps.pyファイルの変更
testsite/views.pyファイルの変更
key:クラスのlabel属性値を設定する
value:クラスのverbose nameプロパティ値の設定
出典:Djangoで学ぶPythonネットワークプログラミング(ベース)-金錫勲
プロジェクトのトップページ
プロジェクトのナビゲーションで「プロジェクトホーム」プロジェクトをクリックしたときにエラーが発生したのは、プロジェクトのトップページのルート(/)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ネットワークプログラミング(ベース)-金錫勲
Reference
この問題について(拡張実験-設計の最初のページ), 我々は、より多くの情報をここで見つけました https://velog.io/@jusung-c/실습확장-첫-페이지-설계テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol