Djangoのチュートリアルでわかることをメモする

スポンサーリンク

【作成途中】Djangoのチュートリアルをやったので、チュートリアルを元に「Django」でのアプリ作成に必要な書き方等をまとめます。将来的には、チュートリアル経験者(初心者)が見たときに、知りたい情報にすぐにアクセスできるようにする予定です。

注意事項

注意事項として

  • 取り合えずわかったことを出力することを主としており、独自の解釈や間違った解釈が入っている可能性があります。
  • 情報は最新ではない、(入力ミスなどで)正しくない場合があります。
  • (2020/04/11時点)現在編集中です。
  • もっと使いやすく書き替えるかもしれません。

以上のことを了承していただいたうえでご覧ください。

Djangoのチュートリアル

Djangoの公式チュートリアルは以下です。

さぁ始めましょう | Django ドキュメント | Django

 

チュートリアルの内容

1度だけ行うこと

linux等にDjangoをインストールする

#python3.6以降, pip, sqlite3(なければ)のインストールが別途必要
python -m pip install Django

インストールされているかどうかの確認

python -m django --version

 

 

プロジェクト/アプリケーションの作成・テスト

プロジェクト … 複数のアプリケーションからなるサイト全体のプログラム群
アプリケーション(アプリ) … サイトの一部分の機能を実現する小規模なプログラム群

新規プロジェクトを作成する(フォルダやファイルを自動生成)

#プロジェクトを配置したい場所で実行。
#実行した場所に(project名)フォルダが作られる
django-admin startproject (project名)

 

アプリケーションを作成/登録する

アプリケーションを作成する
#生成されたmanage.pyがある場所で実行
python manage.py startapp (application名)

 

アプリケーションが処理するurlを設定する
#(project名)/urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    #あるurlパターンが来たら、
    #作成したアプリケーションに処理を任せるようにする
    path('(任意の文字列)/', include('(application名).urls')),
    path('admin/', admin.site.urls),
]
アプリケーションをプロジェクトに登録する
#(project名)/settings.py
INSTALLED_APPS = [
    #configクラスを追加(正確には、application名/apps.pyを参照)
    '(application名).apps.(Application名)Config',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

 

テスト用サーバーを起動する

#生成されたmanage.pyがある場所で実行
#8000はポート番号
python manage.py runserver 8000

 

 

ページを追加する

アプリケーションにページ追加をする流れ

[generic viewを使えるかどうかで処理が変わる]

  • db検索して一覧表示するgeneric view使用(ListView)
  • dbの特定のデータを指定して詳細表示するgeneric view使用(DetailView)
  • それ以外

上述の各場合における処理の流れ

  • views.pyに関数を追加する
  • 画面(html)を作成する
  • urls.pyに追加する
  • (任意)staticによく使うcss等を追加する

 

db検索して一覧表示するgeneric view使用(ListView)

views.pyに関数を追加する(例)
#(application名)/views.py
from django.views import generic
from .models import Question

#ListViewを継承した、わかりやすい名前のクラスを作成
class IndexView(generic.ListView):

    #使用するhtmlファイルの設定
    template_name = '(application名)/index.html'

    #html側で情報を書くときの変数名
    context_object_name = 'latest_question_list'

    #htmlに渡す情報をここで決める
    def get_queryset(self):
        return Question.objects.order_by('-pub_date')[:5]

 

画面(html)を作成する(例)
<!--(application名)/templates/(application名)/index.html-->

<!--latest_question_listはviews.pyで指定した名前-->
{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <!--polls:detailはurls.pyで指定したurl名-->
        <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

 

urls.pyに追加する(例)
#(application名)/urls.py
from django.urls import path
from . import views

app_name = 'polls'
urlpatterns = [
    #polls:indexで指定できる
    path('', views.IndexView.as_view(), name='index'),
]

 

 

dbの特定のデータを指定して詳細表示するgeneric view使用(DetailView)

views.pyに関数を追加する(例)
#(application名)/views.py
from django.shortcuts import get_object_or_404, render
from django.views import generic
from .models import Question

#DetailViewを継承したわかりやすい名前で
class DetailView(generic.DetailView):
    #表示したいテーブルのモデルを設定
    model = Question
    #使用するhtmlの設定
    template_name = '(application名)/detail.html'

    #表示したいデータを設定
    #urls.pyで表示したいデータのpkを設定しているが、
    #表示しちゃいけない場合の条件などを
    #ここで追加することで対応できる
    def get_queryset(self):
        """Excludes any questions that aren't published yet."""
        return Question.objects.filter(pub_date__lte=timezone.now())

 

画面(html)を作成する(例)
<!--(application名)/templates/(application名)/detail.html-->

<!--名前はテーブル(model)名になる-->
<h1>{{ question.question_text }}</h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

<!--polls:voteはurls.pyで設定した名前-->
<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
    <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
{% endfor %}
<input type="submit" value="Vote">
</form>

 

urls.pyに追加する(例)
#(application名)/urls.py
from django.urls import path

from . import views

app_name = 'polls'
urlpatterns = [
    #detailViewではpkが必要。
    #htmlでpolls:detailでこのurl指定できる
    path('<int:pk>/', views.DetailView.as_view(), name='detail'),
]

 

 

それ以外の場合

views.pyに関数を追加する(例)
#(application名)/views.py
from django.shortcuts import get_object_or_404, render
from .models import Question

#urls.pyで指定した引数(question_id)を書いておく
def results(request, question_id):
    #get_object_or_404は、指定したデータを取得する。ないなら404
    #ほかに、get_list_or_404もある。リスト0なら404
    question = get_object_or_404(Question, pk=question_id)

    #引数は順に必須項目、使用するhtml、htmlに渡すデータ
    return render(request, '(application名)/results.html', {'question': question})

 

画面(html)を作成する(例)
<!--(application名)/templates/(application名)/results.html-->
<ul>
{% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
{% endfor %}
</ul>

<a href="{% url 'polls:detail' question.id %}">Vote again?</a>

 

urls.pyに追加する(例)
#(application名)/urls.py
from django.urls import path
from . import views

app_name = 'polls'
urlpatterns = [
    #polls:resultsでこのurlにアクセス可能
    #第二引数で呼び出す関数を指定する。
    #引数は第一引数のurlパターンから勝手に入る。
    path('<int:question_id>/results/', views.results, name='results'),
]

 

 

よく使うcss等をstaticに追加する

#(application名)/static/(application名)以下にファイルを追加する
#例: (application名)/static/(application名)/index.css
#例: (application名)/static/(application名)/images/background.jpg
#static内で別のstatic内ファイルを呼び出すときは相対パスで
追加したファイルを呼び出す
<!--任意の(application名)/templates以下のhtmlファイルで-->
{% load static %}
<!--cssの例-->
<link rel="stylesheet" type="text/css" href="{% static '(application名)/style.css' %}">

 

model(db)の初期設定/追加/編集/処理する

dbの初期設定をする

使用するデータベースを登録する(sqliteの場合は不要)
#(project名)/settings.py
# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
#適宜設定する
DATABASES = {
    'default': {
        #'ENGINE': 'django.db.backends.mysql',
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

 

最低限の機能を持ったdbを作成する
python manage.py migrate

 

 

テーブルを追加/編集等する

dbテーブルの元となるクラスを作成/編集する
#(application名)/models.py
from django.db import models
from django.utils import timezone
import datetime

#1クラスが1テーブル
class Question(models.Model):
    #各変数がフィールド(列名)となる。
    #id(primary key)は自動で生成される

    #文字列のフィールド(max_lengthは必須)
    question_text = models.CharField(max_length=200)

    #datetimeのフィールド(第一引数はプログラマのメモ)
    pub_date = models.DateTimeField('date published')

    #このテーブルに含まれる行の表現を設定する
    #test時やプログラム作成時、adminページ側で可読性を上げることができる
    def __str__(self):
        return self.question_text

    #このテーブルに関連する作業を関数化できる
    #これはその例
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
class Choice(models.Model):
    #外部キーの設定
    #引数は外部テーブルクラスを指定している、on_deleteで削除時の挙動設定
    question = models.ForeignKey(Question, on_delete=models.CASCADE)

    choice_text = models.CharField(max_length=200)

    #integerのフィールドを設定。default値の設定も引数内で行う
    votes = models.IntegerField(default=0)

    #このテーブルの行について、プログラム的な表現を設定する
    #test時やプログラム作成時、adminページ側で可読性を上げることができる
    def __str__(self):
        return self.choice_text 

 

dbの変更があったことを、プロジェクトに通知する
python manage.py makemigrations (アプリケーション名)

 

dbの変更を実際のdbに適用する
python manage.py migrate

 

 

 

 

 

 

 

 

 

 

 

 

コメント

タイトルとURLをコピーしました