Djangoの概要
Djangoはペースの速いニュースルーム環境で開発されたため、一般的なWeb開発タスクを迅速かつ簡単にするように設計されました。 これは、Djangoを使用してデータベース駆動型Webアプリを作成する方法の非公式な概要です。
このドキュメントの目的は、Djangoがどのように機能するかを理解するのに十分な技術的詳細を提供することですが、これはチュートリアルやリファレンスを目的としたものではありません。 プロジェクトを開始する準備ができたら、チュートリアルから始めるまたはより詳細なドキュメントに飛び込むことができます。
モデルを設計する
データベースなしでDjangoを使用することはできますが、Pythonコードでデータベースレイアウトを記述するオブジェクトリレーショナルマッパーが付属しています。
データモデル構文は、モデルを表現するための多くの豊富な方法を提供します。これまで、長年にわたるデータベーススキーマの問題を解決してきました。 簡単な例を次に示します。
from django.db import models
class Reporter(models.Model):
full_name = models.CharField(max_length=70)
def __str__(self):
return self.full_name
class Article(models.Model):
pub_date = models.DateField()
headline = models.CharField(max_length=200)
content = models.TextField()
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
def __str__(self):
return self.headline
それをインストールします
次に、Djangoコマンドラインユーティリティを実行して、データベーステーブルを自動的に作成します。
:djadmin: `makemigrations` コマンドは、使用可能なすべてのモデルを調べて、まだ存在していないテーブルの移行を作成します。 :djadmin: `migrate` は、移行を実行してデータベースにテーブルを作成し、オプションではるかに豊富なスキーマ制御を提供します。
無料のAPIをお楽しみください
これで、データにアクセスするための無料で豊富な Python API を手に入れることができます。 APIはオンザフライで作成され、コード生成は必要ありません。
# Import the models we created from our "news" app
>>> from news.models import Article, Reporter
# No reporters are in the system yet.
>>> Reporter.objects.all()
<QuerySet []>
# Create a new Reporter.
>>> r = Reporter(full_name='John Smith')
# Save the object into the database. You have to call save() explicitly.
>>> r.save()
# Now it has an ID.
>>> r.id
1
# Now the new reporter is in the database.
>>> Reporter.objects.all()
<QuerySet [<Reporter: John Smith>]>
# Fields are represented as attributes on the Python object.
>>> r.full_name
'John Smith'
# Django provides a rich database lookup API.
>>> Reporter.objects.get(id=1)
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__startswith='John')
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__contains='mith')
<Reporter: John Smith>
>>> Reporter.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Reporter matching query does not exist.
# Create an article.
>>> from datetime import date
>>> a = Article(pub_date=date.today(), headline='Django is cool',
... content='Yeah.', reporter=r)
>>> a.save()
# Now the article is in the database.
>>> Article.objects.all()
<QuerySet [<Article: Django is cool>]>
# Article objects get API access to related Reporter objects.
>>> r = a.reporter
>>> r.full_name
'John Smith'
# And vice versa: Reporter objects get API access to Article objects.
>>> r.article_set.all()
<QuerySet [<Article: Django is cool>]>
# The API follows relationships as far as you need, performing efficient
# JOINs for you behind the scenes.
# This finds all articles by a reporter whose name starts with "John".
>>> Article.objects.filter(reporter__full_name__startswith='John')
<QuerySet [<Article: Django is cool>]>
# Change an object by altering its attributes and calling save().
>>> r.full_name = 'Billy Goat'
>>> r.save()
# Delete an object with delete().
>>> r.delete()
動的な管理インターフェース:それは単なる足場ではなく、家全体です
モデルが定義されると、Djangoは、認証されたユーザーがオブジェクトを追加、変更、削除できるWebサイトであるプロフェッショナルな本番環境対応の管理インターフェイスを自動的に作成できます。 必要な唯一のステップは、管理サイトにモデルを登録することです。
from django.db import models
class Article(models.Model):
pub_date = models.DateField()
headline = models.CharField(max_length=200)
content = models.TextField()
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
from django.contrib import admin
from . import models
admin.site.register(models.Article)
ここでの哲学は、あなたのサイトがスタッフ、クライアント、あるいはあなただけによって編集されているということです–そしてあなたはコンテンツを管理するためだけにバックエンドインターフェースを作成することに対処する必要はありません。
Djangoアプリを作成する際の一般的なワークフローの1つは、モデルを作成し、管理サイトをできるだけ早く稼働させて、スタッフ(またはクライアント)がデータの入力を開始できるようにすることです。 次に、データを一般に公開する方法を開発します。
URLをデザインする
クリーンでエレガントなURLスキームは、高品質のWebアプリケーションの重要な詳細です。 Djangoは美しいURLデザインを奨励し、.php
や.asp
のようなURLに無駄を入れません。
アプリのURLを設計するには、 URLconf というPythonモジュールを作成します。 アプリの目次。URLパターンとPythonコールバック関数の間のマッピングが含まれています。 URLconfは、URLをPythonコードから分離する役割も果たします。
上記のReporter
/ Article
の例では、URLconfは次のようになります。
from django.urls import path
from . import views
urlpatterns = [
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<int:pk>/', views.article_detail),
]
上記のコードは、URLパスをPythonコールバック関数(「ビュー」)にマップします。 パス文字列はパラメータタグを使用して、URLから値を「キャプチャ」します。 ユーザーがページをリクエストすると、Djangoは各パスを順番に実行し、リクエストされたURLに一致する最初のパスで停止します。 (いずれも一致しない場合、Djangoは特殊なケースの404ビューを呼び出します。)パスはロード時に正規表現にコンパイルされるため、これは非常に高速です。
URLパターンの1つが一致すると、Djangoは指定されたビューを呼び出します。これはPython関数です。 各ビューには、リクエストメタデータを含むリクエストオブジェクトと、パターンでキャプチャされた値が渡されます。
たとえば、ユーザーがURL「/ articles / 2005/05/39323 /」をリクエストした場合、Djangoは関数news.views.article_detail(request, year=2005, month=5, pk=39323)
を呼び出します。
あなたの意見を書いてください
各ビューは、要求されたページのコンテンツを含む HttpResponse オブジェクトを返すか、 Http404 などの例外を発生させるという2つのことのいずれかを実行する責任があります。 後は君しだい。
通常、ビューはパラメーターに従ってデータを取得し、テンプレートをロードして、取得したデータを使用してテンプレートをレンダリングします。 上から見たyear_archive
のビューの例を次に示します。
from django.shortcuts import render
from .models import Article
def year_archive(request, year):
a_list = Article.objects.filter(pub_date__year=year)
context = {'year': year, 'article_list': a_list}
return render(request, 'news/year_archive.html', context)
この例では、Djangoのテンプレートシステムを使用します。これは、いくつかの強力な機能を備えていますが、プログラマー以外の人が使用できるようにシンプルに保つように努めています。
テンプレートをデザインする
上記のコードは、news/year_archive.html
テンプレートをロードします。
Djangoにはテンプレート検索パスがあり、テンプレート間の冗長性を最小限に抑えることができます。 Djangoの設定で、テンプレートをチェックするディレクトリのリストを指定します。 :setting: `DIRS ` 。 テンプレートが最初のディレクトリに存在しない場合は、2番目のディレクトリをチェックします。
news/year_archive.html
テンプレートが見つかったとしましょう。 これは次のようになります。
{% extends "base.html" %}
{% block title %}Articles for {{ year }}{% endblock %}
{% block content %}
<h1>Articles for {{ year }}</h1>
{% for article in article_list %}
<p>{{ article.headline }}</p>
<p>By {{ article.reporter.full_name }}</p>
<p>Published {{ article.pub_date|date:"F j, Y" }}</p>
{% endfor %}
{% endblock %}
変数は二重中括弧で囲まれています。 テンプレート:Article.headline
は、「記事のヘッドライン属性の値を出力する」ことを意味します。 ただし、ドットは属性の検索にのみ使用されるわけではありません。 また、辞書キールックアップ、インデックスルックアップ、および関数呼び出しも実行できます。
注テンプレート:Article.pub date
は、Unixスタイルの「パイプ」(「|」文字)を使用します。 これはテンプレートフィルターと呼ばれ、変数の値をフィルター処理する方法です。 この場合、日付フィルターはPythonのdatetimeオブジェクトを指定された形式でフォーマットします(PHPのdate関数にあります)。
必要な数のフィルターをチェーンすることができます。 カスタムテンプレートフィルターを作成できます。 カスタムテンプレートタグを記述して、バックグラウンドでカスタムPythonコードを実行できます。
最後に、Djangoは「テンプレート継承」の概念を使用しています。 それが{% extends "base.html" %}
が行うことです。 これは、「最初に、一連のブロックを定義した「base」というテンプレートをロードし、次のブロックでブロックを埋める」ことを意味します。 つまり、テンプレートの冗長性を大幅に削減できます。各テンプレートは、そのテンプレートに固有のものだけを定義する必要があります。
静的ファイルの使用を含む「base.html」テンプレートは次のようになります。
{% load static %}
<html>
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<img src="{% static 'images/sitelogo.png' %}" alt="Logo">
{% block content %}{% endblock %}
</body>
</html>
簡単に言うと、サイトのルックアンドフィール(サイトのロゴ付き)を定義し、子テンプレートが埋めるための「穴」を提供します。 これは、ベーステンプレートという単一のファイルを変更することでサイトの再設計を実行できることを意味します。
また、子テンプレートを再利用しながら、異なるベーステンプレートを使用してサイトの複数のバージョンを作成することもできます。 Djangoの作成者は、この手法を使用して、新しいベーステンプレートを作成するだけで、著しく異なるモバイルバージョンのサイトを作成しました。
別のシステムを使用する場合は、Djangoのテンプレートシステムを使用する必要がないことに注意してください。 DjangoのテンプレートシステムはDjangoのモデルレイヤーと特によく統合されていますが、それを使用することを強制するものは何もありません。 さらに言えば、DjangoのデータベースAPIを使用する必要もありません。 別のデータベース抽象化レイヤーを使用したり、XMLファイルを読み取ったり、ディスクからファイルを読み取ったりすることができます。 Djangoの各部分(モデル、ビュー、テンプレート)は、次の部分から切り離されています。
これはただの表面です
これは、Djangoの機能の概要にすぎません。 いくつかのより便利な機能:
- memcachedまたは他のバックエンドと統合するキャッシングフレームワーク。
- 小さなPythonクラスを作成することでRSSフィードとAtomフィードを作成できるシンジケーションフレームワーク。
- より魅力的な自動生成された管理機能–この概要は表面をほとんど傷つけませんでした。
次のステップは、 Django をダウンロードし、チュートリアルを読み、コミュニティに参加することです。 ご関心をお寄せいただきありがとうございます。