Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Djangoで動的サイトを作ろう

 Djangoで動的サイトを作ろう

Presentation at UTMC (http://komaba.utmc.or.jp/).

antenna_three

July 02, 2021
Tweet

More Decks by antenna_three

Other Decks in Programming

Transcript

  1. 余談 | 近年のWeb技術 Jamstack (JavaScript + API + Markup) が注目されている

    CSR (Client Side Rendering) JavaScriptを使ってクライアント(ブラウザ)側でWebページを生成 SSR (Server Side Rendering) CSRに近い構成でリクエスト時にサーバー側でHTMLを生成(つまり動的Webサイト) SSG (Static Site Generation) ビルド時に静的Webサイトを生成
  2. Python仮想環境の作成 $ mkdir utmc-django & cd utmc-django #←このフォルダ名は何でも可 $ python

    -m venv venv 仮想環境の有効化 PowerShell (Windows) の場合: $ venv/scripts/activate.ps1 bash (Mac/Linux) の場合: $ source venv/bin/activate
  3. サンプルプロジェクトのクローン $ git clone https://github.com/antenna-three/utmc-django-tutorial.git データベースの作成 $ cd utmc-django-tutorial $

    python manage.py migrate 開発サーバーの起動 $ python manage.py runserver ブラウザで http://localhost:8000 にアクセスしてみよう
  4. プロジェクトの構成 合宿 ( gasshuku ) プロジェクトの中に参加登録 ( register ) アプリケーションがある

    要望アンケートなどの機能を実装するときはアプリケーションを追加すればよい プロジェクトの設定は gasshuku/settings.py に書かれている . ├─gasshuku ├─register │ └─templates │ └─register └─templates
  5. View リクエストからレスポンスを作る テンプレートにデータを渡してHTMLを作ることが多い ( render ) register/views.py def entry(request): admission_years

    = list(range(2021, 1975, -1)) entry_dates = [date(2021, 9, day) for day in [10, 11, 12, 13]] context = { 'admission_years': admission_years, 'entry_dates': entry_dates, } return render(request, 'register/entry.html', context)
  6. テンプレート 通常のHTMLにviewから受け取った変数 {{ }} や制御文 {% %} を混ぜて書く register/templates/register/entry_list.html <table>

    {% for entry in entry_list %} <tr> <td>{{ entry.screen_name }}</td> <td>{{ entry.admission_year }}</td> <td>{{ entry.start_date }}</td> <td>{{ entry.end_date }}</td> </tr> {% endfor %} <table>
  7. URL URLとViewを対応付ける name はDjangoアプリケーション内での名前、 app_name は名前空間 register/urls.py app_name = 'register'

    urlpatterns = [ path('', views.index, name='index'), path('list/', views.ListView.as_view(), name='list'), path('entry/', views.entry, name='entry'), path('submit/', views.submit, name='submit'), path('details/<int:pk>', views.DetailView.as_view(), name='details'), path('results/<int:pk>', views.ResultView.as_view(), name='results'), ]