ディレクトリ
1.Django MTVフレームワークの紹介
2.基本コマンドは、プロジェクトの構成記述を作成します
3.前後端インタラクティブケース
データの相互作用に基づく削除のための4条件を変更して再検索データベース
ジャンゴの概要
Djangoフレームワークは、思考のMVCデザインパターンに描画し、MVCの異なる点は、それが三つの部分、すなわちに分かれていることである:(モデル)モデル、(テンプレート)テンプレート、および(ビュー)ビュー
MTV MVCと追加するための知識:
MVCは、彼らがモデルのモデル、ビュー、およびコントローラのビューコントロールされ、三つの言葉の略語の最初の文字です。
1)トップ層は、直接「表示層」エンドユーザー(閲覧)に直面しています。これは、ユーザーインターフェースに提供され、シェルです。
2)底部層は、「データ層」(モデル)のコア、動作させるプログラム情報またはデータです。
3)中間層、すなわち、に従って「表示層」の選択データ「データ層」からユーザの指示入力の原因である「制御層」(コントローラ)、および最終的な結果を生成するために、対応する動作に供されます。
(シモンズ:三層が密接に関連するが、互いに独立しており、それぞれの層の内の他の層に影響を与えることなく、各層を変更された外部インターフェイス(Interface)を提供し、上記層を必要とします。)
DjangoのMTV
モデルモデル:オブジェクトは、データベースオブジェクトに責任がある(ORM)
テンプレートテンプレート:ユーザーにページを表示する方法を担当
Viewタイトル:ビジネスロジックを担当し、かつ適切な時期にモデルとテンプレートを呼び出します
また、DjangoはディストリビューターをURLとしてだけでなく、それは異なる治療を表示するために、分散ページ要求のURLの役割であり、モデルとテンプレートに適切なビューを呼び出します
Djangoプロジェクトを作成します。
1 。プロジェクト作成 ジャンゴ - ADMINのstartprojectの個人用サイトの 2のプロジェクトを作成したら、あなたは個人用サイトの余分なフォルダと呼ばれる、現在のディレクトリのフォルダを表示することができます。 個人用サイト / manage.py 個人用サイト / __init__ の.py のsettings.py のurls.py wsgi.py
3プロジェクトを開始する
のp- ython manage.pyのrunserver#のデフォルトポート8000
指定されたポート
新たに指定されたポートの8888#8888のrunserverのpython manage.py
コロンで区切られます。また、IPとポートを指定することができます127.0.0.1:8000#RUNSERVERのpython manage.py、
アプリの作成4。
app01 / 移行 を__init__.py を__init__.py のadmin.py #admin構成 apps.py# models.py#ORMを使用するデータベースと相互作用する 試験#1 tests.py とviews.py位ライト機能
5.データベース移行
Pythonのmanage.py makemigrations Pythonの移行manage.pyの
6は、スーパーユーザを作成します。
manage.py createsuperuserのパイソン
:原則は
プロジェクトは、あなたがあなた自身の追加アプリ(アプリは、主に特定の機能を書き込むために使用される)、およびテンプレートを作成する必要があるコマンド(保存されたテンプレートによって作成された場合、後に、プロジェクトを作成し、適切な構成設定で実行する必要がありますファイル)
以下の小さな例のページの成功に成功したジャンプの後のログインパスワードです:
あなたが作成した1作成Pythonのmanage.py startappのapp01 app01ディレクトリが自動的に適切なファイルが生成されます
。2.テンプレートディレクトリの作成
コンフィギュレーション設定をしてapp01テンプレートをサポート
= INSTALLED_APPS [
'django.contrib.admin'、
'django.contrib.auth'、
'django.contrib.contenttypes'、
'django.contrib.sessions'、
'django.contrib.messages'、
'django.contrib.staticfiles' 、
「app01.apps.App01Config」、#は、直接クラスに導入することができる。この行を追加します
]
= TEMPLATES [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates'、
'DIRS':[os.path.join(BASE_DIR、 "テンプレート")]、プロジェクトがpycharmを作成された場合#は、この行を追加デフォルトはokです。
'APP_DIRS':真、
[オプション]:{
'context_processors':[
'django.template.context_processors.debug'、
'django.template.context_processors.request'、
'django.contrib.auth.context_processors.auth'、
'ジャンゴ.contrib.messages.context_processors.messages'
]、
}、
}
]
ノートはフォームの送信をサポートするためのミドルウェアをCSRF(ユーステスト)
ミドルウェア= [
'django.middleware.security.SecurityMiddleware'、
'django.contrib.sessions.middleware.SessionMiddleware'、
'django.middleware.common.CommonMiddleware'、
#'django.middleware.csrf.CsrfViewMiddleware'、
「django.contrib .auth.middleware.AuthenticationMiddleware」、
'django.contrib.messages.middleware.MessageMiddleware'、
'django.middleware.clickjacking.XFrameOptionsMiddleware'
]
あなたが安全に無視できるように、第2ケースでMySQLの設定を追加し、最初のケースは、MySQLと相互作用しません
pymysqlインポート
pymysql.install_as_MySQLdb()#同じレベルの設定ファイルに、一般のinit
DATABASES = {
'デフォルト':{
'ENGINE': 'django.db.backends.mysql'、
'NAME': 'Day14'、
「HOST 「: 『127.0.0.1』、
『ポート』:3306、
『USER』:」ルート「
『パスワード』:」王」は、
}
}
標準化後の使用のために、格納された静的ファイルを変更します
STATIC_URL =「/静的/」#エイリアスは対応
STATICFILES_DIRS = [
os.path.join(BASE_DIR、「静的」)
]
の設定端を指す
対話前後端の簡単な場合:例
経路に対応するURL分配を変更する、ユーザを、当然のapp01ビューの下でどこのすべての権利が、内部書かれたビューの標準化のために書き込む機能を実行するための操作を転送します
インポートモジュールは、ビューapp01インポートビューから
urlpatternsは= [
URL(R&LT 'ADMIN ^ /'、admin.site.urls)、
URL(R&LT 'ログイン^ /'、views.login)、
URL(R&LT 'インデックス^ /'、ビュー.INDEX)特定の機能に書き込ま
]
ビュー内のロジックコード
django.shortcutsからレンダリング、リダイレクト、HttpResponseにインポート
#ここにあなたの意見を作成します。
デフ指数(要求):
リターンがレンダリング(リクエスト、 'success.html')
デフログイン(リクエスト):
もしrequest.method == 'POST':
ユーザー= request.POST.get( 'ユーザー')
PWD = request.POST .get( 'PWD')
ユーザー== '管理者'とPWD == '管理者'の場合:
#用户登录成功
リターンリダイレクト( '/インデックス/')
他には:
「{、(要求、 'login.htmlと'のレンダリングを返しますエラー":"用户名或密码错误"})
リターンがレンダリング(リクエスト、 'login.htmlと')
模板文件
login.htmlと
<!DOCTYPE HTML>
<HTML LANG = "EN">
<HEAD>
<メタ文字コード= "UTF-8">
<タイトル>登录</ TITLE>
</ HEAD>
<BODY>
<フォームアクション= ""メソッド=」ポスト">
<P>
ユーザー名">用户名</ label>は=のための<ラベル"
の<input type =" text "ID = "ユーザ名"名前= "ユーザー">
</ P>
<P>
<=のラベル"パスワード">密码</ラベル>
の<input type ="パスワード」ID = "パスワード" NAME = "PWD">
</ P>
<P>
{{エラー}}
</ P>
<入力タイプ= "提出"値= "ログイン">
</ FORM>
</ BODY>
</ HTML>
ログインに成功し、このディレクトリにリダイレクトした後
success.html
<!DOCTYPE HTML>
<HTML LANG = "EN">
<HEAD>
<メタ文字コード= "UTF-8">
<タイトル>タイトル</ TITLE>
</ HEAD>
<BODY>
<H1>
登录成功
</ H1>
</ BODY>
</ HTML>
验证结果:
プロジェクトを開始するためのpython manage.pyのrunserver
正しいユーザー名とパスワードを入力します。
その他
データベース接続の操作の後
使用ジャンゴMySQLデータベースの構成 図1は、データベースMySQLを作成する。 2 データベースの設定に配置: 3 。MySQLデータベースモジュールはpymysql使用して接続されている 同じレベルのディレクトリの設定で__init__.pyを: インポートpymysql pymysql.install_as_MySQLdb() 。4 。アプリの下に書かれたmodels.pyに基づいて、テーブルを作成します から django.db インポートモデル #ここにあなたのモデルを作成します壁紙。 クラスのUserInfo(models.Model): ユーザ名 = models.CharField(MAX_LENGTH = 32) #VARCHAR(32) パスワードmodels.CharField =(MAX_LENGTH = 32 )#コメントを表す削除 5。データベースの移行を実行するためのコマンド manage.py makemigrationsはPythonの #は、移行ファイルが変更models.pyの記録に記録されて作成 Pythonがマイグレーション・manage.pyの #は、データベースの移行を実行します
:特定の操作ORM
すべてのデータオブジェクトのRET = models.Publisher.objects.all()#のクエリリスト
RETで私のために:
印刷(I、タイプ(I))オブジェクトデータベースのデータに対応する#
プリント(i.name、私を。 ID)#属性値フィールド
models.Publisher.objects.filter(名前= PUBLISHER_NAME)は空のリストを見つけることです
models.Publisher.objects.create(名前= PUBLISHER_NAME)新增
models.Publisher.objects.filter(ID = ID).delete()删除
変更
PUBLISHER_NAME = request.POST.get( 'PUBLISHER_NAME')
#編集
pub_obj.name = PUBLISHER_NAME番号の変更のみメモリ内
pub_obj.save()#は、データベースへの変更を保存
模板
{RET%以下でパブ%}
<TR>
<TD> {{pub.id}} </ TD>
<TD> {{pub.name}} </ TD>
</ TR>
{%ENDFOR%}
切除に基づく方法のデータベース検索操作の例
データベース内のクエリとフロントファイルの読み取りデータ表示 models.py構成ファイル から django.db インポートモデル クラスPulisher(models.Model): 名前 = models.CharField(MAX_LENGTH = 32) #は、テーブルおよびフィールドの作成 、管理PYTHON。 makemigrations Pyの Pythonは移行manage.pyの 複数のレコードの効果を示すために、独自のテーブルを追加した上で URL名ディスペンサで実行される機能を追加 rlpatterns = [ URL(R&LT ' ^ ADMIN / ' 、admin.site.urls)の URL(R&LT ' ^ログイン/ ' 、views.login)、 URL(R&LT ' ^インデックス/ ' 、views.index)、 URL(R&LT '^ / publisher_listである'、views.publisher_list) #のどのビューに対応する名前関数名 機能論理ビューの内部 から app01 インポートモデル #が次の動作を可能にするために、このモジュールに基づいて、モジュールのモデルをインポートする必要があり、 DEF publisher_listこと(要求): RET = models.Pulisher .objects.all() #RETで私のために: #1 (I、タイプ(1))を印刷 #の 印刷(i.name、i.id) を返すレンダリング(リクエスト、' publisher_list.html '、{ " RET " :RET }) publisher_list.htmlテンプレート・コンフィギュレーション・ファイル <!DOCTYPE HTML> <HTML LANG = "EN " > <HEAD> <メタ文字コード= " UTF-8 " > <タイトル>タイトル</ TITLE> </ HEAD> <BODY> <H1>出版社列表</ H1> <テーブルのボーダー= " 1 " > < THEAD> <TR> <TH> ID </番目> <TH>名称</番目> </ TR> </ THEAD> <TBODY> {%ためのパブでのRET%} <TR> <TD> {{パブ。 ID}} </ TD> <TD> {{pub.name}} </ TD> </ TR> {%ENDFOR%} </ TBODY> </テーブル> </ BODY> </ HTML>
の結果が示されています。
PS:テーブルpublisher_listの建設は、私はいくつかの手紙を書いたとき以来のモジュールの名前は、モデルをインポートするとき、そう、などそれ以外の場合はエラーになります。
2.インスタンスを追加します。
モデルは、内部テーブルを追加します
Pulisherクラス(models.Model):
名前= models.CharField(MAX_LENGTH = 32)
URLは、関数名を追加しました
= urlpatterns [
URL(R&、admin.site.urls LT '^ / ADMIN')、
URL(R&LT 'ログイン^ /'、views.login)、
URL(R&LT 'インデックス^ /'、views.index)、
URL(R&LT 、)、views.publisher_list「^ / publisher_listである」
)URL(R&LT「add_publisher ^ /」、views.add_publisher
]
全く追加がない場合、フィールドは、追加することが、本プロンプトであれば、詳細な実施ロジック内部書き込まビュー
def add_publisher(request):
if request.method == 'POST':
publisher_name = request.POST.get("publisher_name")
ret = models.Pulisher.objects.filter(name=publisher_name)
if ret:
return render(request, "add_publisher.html",{"error":"出版社名称已存在"})
models.Pulisher.objects.create(name=publisher_name)
return redirect("/publisher_list/")
return render(request,"add_publisher.html")
add_publisher.html 里面的代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
<p>
<label for="">出版社名称</label>
<input type="text" name="publisher_name"><span>{{error}}</span>
</p>
<button>新增</button>
</form>
</body>
</html>
结果展示
添加不存在的直接添加并展示出添加后的结果
3.删除例子
urls添加函数名
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^index/', views.index),
url(r'^publisher_list/', views.publisher_list),
url(r'^add_publisher/', views.add_publisher),
url(r'^del_publisher/', views.del_publisher)
]
views里面的函数逻辑
def del_publisher(request):
id = request.GET.get("id") #这里的GET是url携带的参数
models.Pulisher.objects.filter(id = id).delete()
return redirect("/publisher_list/")
publisher_list.html 文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>出版社列表</h1>
<table border="1">
<thead>
<tr>
<th>ID</th>
<th>名称</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for pub in ret %}
<tr>
<td>
{{pub.id}}
</td>
<td>
{{pub.name}}
</td>
<td><a href="/del_publisher/?id={{pub.id}}">删除</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
验证结果:
访问地址直接点击删除即可。
4.修改操作
urls添加函数
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^index/', views.index),
url(r'^publisher_list/', views.publisher_list),
url(r'^add_publisher/', views.add_publisher),
url(r'^del_publisher/', views.del_publisher),
url(r'^edit_publisher/', views.edit_publisher),
]
views里面函数逻辑
def edit_publisher(request):
id = request.GET.get("id")
pub_list = models.Pulisher.objects.filter(id=id)#拿到对象列表
print(pub_list)
pub_obj = pub_list[0]
print(pub_obj)
if request.method == "POST":
publisher_name = request.POST.get("publisher_name")
pub_obj.name = publisher_name
pub_obj.save() #保存修改到数据库
return redirect("/publisher_list/")
return render(request,"edit_publisher.html",{"pub_obj":pub_obj})
publisher_list原有的基础上添加:
<a href="/edit_publisher/?id={{pub.id}}">编辑</a></td>
edit_publisher.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
<p>
<label for="">出版社名称</label>
<input type="text" name="publisher_name" value="{{pub.obj.name}}"><span>{{error}}</span>
</p>
<button>保存</button>
</form>
</body>
</html>
完成!