目次
1. MVT の概要
Mは Model と綴られ、MVC の M と同じ機能を持ち、データベースと対話してデータを処理します。
Vの正式なスペルは View で、MVC の C と同じ機能を持ち、リクエストを受け取り、業務処理を実行し、レスポンスを返します。
Tの完全なスペルは Template です。これは MVC の V と同じ機能を持ち、返された HTML をカプセル化して構築する役割を果たします。
Django の MVT は、MVC の実行フローに従います。
MVT はモデル テンプレート ビュー パターンであり、その標準名には議論の余地があります。MVC の解釈では、ビューはユーザーに提示されるデータを記述し、データの見方ではなく、表示されるデータを参照します。Python では、コールバック関数は表示されるデータを記述するため、ビューは特定の URL のコールバック関数を参照します。テンプレートは、コンテンツとプレゼンテーションを分離するために使用されます。Django では、ビューは表示されるデータを記述し、通常、ビューはテンプレートに渡されます。テンプレートはデータの表示方法を記述し、コントローラーは django フレームワーク自体を参照し、URL 設定を通じてシステムは適切なビューにリクエストを送信します。
2. Mモデルクラス
今までSQL文を書いてデータベースを操作していましたが、SQL文を書かずにデータベースを操作することはできるのでしょうか?はい、次に説明するのは ORM フレームワークによるものです。
Oはオブジェクト、つまりクラスオブジェクト、Rはリレーション、中国語に訳すとリレーション、つまりリレーショナルデータベースのデータテーブルの意味、Mはマッピング、つまりマッピングを意味します。ORM フレームワークでは、クラスとデータ テーブルのマッピングに役立ち、クラスとクラス オブジェクトを通じて対応するテーブル内のデータを操作できるようになります。ORM フレームワークには、設計したクラスに従ってデータベース内にテーブルを自動的に生成する機能もあり、自分でテーブルを構築するプロセスを省略できます。
ORM フレームワークは django に組み込まれており、データベース プログラミングを直接行う必要はありませんが、モデル クラスを定義し、モデル クラスとオブジェクトを通じてデータ テーブルの追加、削除、変更、クエリ操作を実行します。
django を使用したデータベース開発の手順は次のとおりです。
- 1.models.pyでモデルクラスを定義します。
- 2. 移行
- 3. インスタンス オブジェクトを通じてデータの追加、削除、変更、クエリ操作を完了する
Django でのデータベース開発のプロセス全体を紹介するために、書籍情報の保存を例に挙げてみましょう。
1. モデルクラスを定義する
モデル クラスは models.py ファイルで定義され、models.Model クラスを継承します。
説明: 主キーを定義する必要はありません。主キーは生成時に自動的に追加され、値は自動的に増加します。
デザインブック
書籍:
- クラス名: BookInfo
- 書籍名:btitle
- 発行日: bpub_date
設計に従って、./booktest/models.py にモデル クラスを次のように定義します。
from django.db import models
class BookInfo(models.Model):
btitle = models.CharField(max_length=20)
bpub_date = models.DateField()
2. 移行
移行は 2 つの手順で行われます。
- 移行ファイルの生成: モデル クラスに基づいてテーブルを作成するための移行ファイルを生成します。
- 移行の実行: 最初のステップで生成された移行ファイルに従ってデータベースにテーブルを作成します。
2.1 移行ファイルを生成するコマンドは次のとおりです。
python manage.py makemigrations
移行ファイルの生成コマンドを実行すると、アプリケーション booktest ディレクトリの下の migrations ディレクトリに移行ファイルが生成されます。
上図の移行ファイルを開くと、内容は次のとおりです。
# Generated by Django 3.1.2 on 2020-10-25 12:27
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='BookInfo',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('btitle', models.CharField(max_length=20)),
('bpub_date', models.DateField()),
],
),
]
Django フレームワークは、設計したモデル クラスに基づいて移行ファイルを生成します。移行ファイルでは、フィールド リストの各要素が BookInfo クラスの属性名および属性タイプと一致していることがわかります。同時に、追加の id 項目があることがわかりました。これは Django フレームワークによって自動的に生成され、テーブルを作成するときに、id が対応するテーブルの主キー列として使用され、主キーとして使用されます。列は自動的に成長します。
2.2 次のように移行コマンドを実行します。
python manage.py migrate
移行コマンドが実行されると、Django フレームワークが移行ファイルを読み取り、対応するテーブルをデータベースに自動的に生成します。データテーブルのデフォルト名は次のとおりです。<app_name>_<model_name>
例:
booktest_bookinfo
3. データベースの運用
データ テーブルの移行が完了したら、Python 対話モードに入り、Django が提供する無料の API を使用してみます。「python」と直接入力して対話モードに入ることができないことに注意してください。次のコマンドを使用して Python シェルを呼び出します。
python manage.py shell
DJANGO_SETTINGS_MODULEmanage.py
環境変数 が file に設定されているため、Django にtest1 ファイルへのPython インポート パスが提供されます。/settings.py
「python」と直接入力して対話モードに入ると、booktest.models から BookInfo をインポートするときに次のエラーが報告されます。
django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured.
You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
DJANGO_SETTINGS_MODULE環境変数を手動で追加する必要があります
>>> import os,django
>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "test1.settings")
'test1.settings'
>>> django.setup()
>>> from booktest.models import BookInfo
>>> BookInfo.objects.all()
<QuerySet []>
>>>
シェルに入ったら、データベース APIを探索します。
>>> from booktest.models import BookInfo
>>> # 查询数据库所有信息
>>> BookInfo.objects.all()
<QuerySet []>
>>>
>>> #新增数据
>>> book1=BookInfo()
>>> book1.btitle='射雕英雄传'
>>> import datetime
>>> book1.bpub_date=datetime.date(1990, 1, 1)
>>> book1.save()
>>> BookInfo.objects.all()
<QuerySet [<BookInfo: BookInfo object (1)>]>
>>>
>>>
>>> # 查找指定条件数据
>>> book2=BookInfo.objects.get(id=1)
>>> book2.btitle
'射雕英雄传'
>>>
>>> # 修改数据
>>> book2.btitle='神雕侠侣'
>>> book2.save()
>>>
>>> # 删除数据
>>> book2.delete()
(1, {'booktest.BookInfo': 1})
>>> BookInfo.objects.all()
<QuerySet []>
その他の API メソッドについては、django ソース コードを表示できます。パスは django.db.models.query.QuerySet です。
QuerySet [<BookInfo: BookInfo object (1)>]> は、このオブジェクトを理解するのがあまり直観的ではありません。この問題を解決するには、BookInfo モデル クラス (test1/models.py にあります) に __str__() メソッドを追加します。
class BookInfo(models.Model):
...
def __str__(self):
return F"btitle:{self.btitle},bpub_date:{self.btitle}"
シェルに再度入った後
>>> from booktest.models import BookInfo
>>> BookInfo.objects.all()
<QuerySet [<BookInfo: btitle:射雕英雄传,bpub_date:1980-05-01>, <BookInfo: btitle:天龙八部,bpub_date:1986-07-24>, <BookInfo: btitle:雪山飞狐,bpub_date:1987-11-11>]>
>>>
3. V ビュー
django が設計した MVT フレームワークでは、ユーザーが URL でビューをリクエストし、ビューはリクエストを受け取って処理し、処理結果をリクエスタに返します。
ビューを使用するには、次の 2 つの手順が必要です。
- ビュー関数を定義する
- URLconf の構成
1. ビューを定義する
ビューは、views.py で定義された Python 関数です。
ビューには、通常リクエストとして定義されるパラメータが必要です。ビューは HttpResponse オブジェクトを返す必要があり、HttpResponse 内のパラメータの内容がブラウザ ページに表示されます。
booktest/views.py ファイルを開き、次のようにビュー インデックスを定義します。
from django.http import HttpResponse
def index(request):
return HttpResponse("hello python!")
2. URLconf を設定する
ビューの検索プロセスは、リクエスタがブラウザのアドレスバーに URL を入力し、Web サイトにリクエストした後、URL 情報を取得し、用意された URLconf と 1 つずつ照合し、照合に成功すると、 URLconf がない場合、一致に成功すると 404 エラーが返されます。
URLconf には、URL ルールとビューが含まれています。
- URL ルールは正規表現を使用して定義されます。
- ビューは、views.py で定義されたビュー関数です。
URLconf 構成を完了するには、次の 2 つの手順が必要です。
- 1. アプリケーションで URLconf を定義する
- 2. プロジェクトの URLconf に含まれる
booktest/application の下に新しい urls.py ファイルを作成し、次のようにコードを定義します。
from django.conf.urls import url
from booktest import views
urlpatterns = [
url('index', views.index),
]
booktest/urls をプロジェクトに含める: test1/urls.py ファイルを開き、次のように項目を urlpatterns リストに追加します。
path('booktest/', include('booktest.urls')),
test1/urls.py ファイルの完全なコードは次のとおりです。
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('booktest/', include('booktest.urls')), # booktest/ 可以为空白
]
アクセスサーバー
ビューと URLconf が定義されているので、ブラウザーのアドレス バーに URL を入力します。
4. T テンプレート
美しいページを依頼者に返すにはどうすればよいでしょうか?
間違いなく html と css を使用する必要があります。さらに派手な効果が必要な場合は、js を追加する必要があります。問題は、そのようなフィールド文字列の束をすべて HttpResponse() のパラメーターとしてビューに書き込む必要があるかどうかです。文字列を定義しても何の効果もエラーも発生しないので、このように定義するのは面倒なので、フロントエンドページを具体的に定義する場所があれば良いのですが。
この問題を解決するテクノロジー、それがテンプレートです。
Django では、テンプレートでフロントエンドの内容を定義し、そのテンプレートをビューに渡して呼び出すと、さまざまな美しくクールなエフェクトが表示されます。
テンプレートファイルを作成する
新しいテンプレート ディレクトリをプロジェクト test1 に追加します。これで、テンプレートを test1 に直接置くことができます/templates
が、そうすることはお勧めできません。Django は、名前に一致する最初のテンプレートを選択します。別のアプリケーションに同じ名前のテンプレートがある場合、Django はそれらを区別できません。Django が正しい場所を指定できるようにする必要があります。これを確実に行うための最良の方法は、これらのテンプレートをアプリケーション自体の名前にちなんだ別のディレクトリに置くことです。ディレクトリ構造は次のとおりです。
テンプレートの検索パスを設定します。test1/settings.py ファイルを開き、TEMPLATES の DIRS 値を設定します。
'DIRS': [os.path.join(BASE_DIR, 'templates')],
完全な構成は次のとおりです。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
テンプレートを定義する
テンプレートに変数を出力するための構文は次のとおりです。変数はビューから渡すことも、テンプレートで定義することもできます。
{
{变量名}}
テンプレートにコード スニペットを記述するための構文は次のとおりです。
{%代码段%}
templtes/booktest/index.html ファイルを開き、次のようにテンプレートを定義します。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图书列表</title>
<style>
td {text-align: center;}
</style>
</head>
<body>
<h1>{
{title}}</h1>
<table width="500px">
<tr>
<th>书籍名称</th>
<th>发布日期</th>
</tr>
{%for book in books%}
<tr>
<td>{
{book.btitle}}</td>
<td>{
{book.bpub_date}}</td>
</tr>
{%endfor%}
</table>
</body>
</html>
通話テンプレートを表示する
テンプレートの呼び出しは 3 つのステップに分かれています。
- 1. テンプレートを見つける
- 2. コンテキストを定義する
- 3. テンプレートをレンダリングする
booktst/views.py ファイルを開き、上で定義したテンプレート ファイルを呼び出します。
from django.shortcuts import render
from booktest.models import BookInfo
from django.http import HttpResponse
from django.template import loader, RequestContext
# Create your views here.
def index(request):
# 1.获取模板
template=loader.get_template('booktest/index.html')
# 2.定义上下文
books = BookInfo.objects.all()
# context=RequestContext(request,{'title':'图书列表','books':books}) # 老版本
context = {'title': '图书列表', 'books': books}
# 3.渲染模板
# return HttpResponse(template.render(context)) # 老版本
return HttpResponse(template.render(context, request))
ブラウザを開いてページを更新すると、表示効果は次のようになります。
呼び出しテンプレートの短縮表現を表示する
ビュー呼び出しテンプレートは上記の 3 つの部分を実行する必要があるため、Django は上記のコードをカプセル化する関数 render を提供します。render メソッドには 3 つのパラメータが含まれています。
- 最初のパラメータはリクエストオブジェクトです
- 2 番目のパラメータはテンプレート ファイルのパスです。
- 3 番目のパラメータは辞書で、テンプレートに渡されるコンテキスト データを表します。
booktst/views.py ファイルを開くと、render を呼び出すコードは次のとおりです。
from django.shortcuts import render
from booktest.models import BookInfo
# Create your views here.
def index(request):
books = BookInfo.objects.all()
context = {'title': '图书列表', 'books': books}
return render(request, 'booktest/index.html', context)
ソースコードおよびその他のデータ取得方法
ソースコードを入手したいお友達は、いいね+コメント+お気に入りのトリプルをお願いします!
3回連続でコメント欄に個別メッセージを送ります〜