テーブルのリレーションシップのORMを確立する方法
多対
多の
オン
from django.db import models
# Create your models here.
class Book(models.Model): # 图书表
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8, decimal_places=2) # 小数(总位数,小数点后位数)
publish = models.ForeignKey(to='Publish') # 一对多 # to用来指定跟那张表有关系
# 外键建议加在查询频率较高的那张表
author = models.ManyToManyField(to='Author') # 多对多 # django orm会自动帮你创建书籍和作者的第三张表作用
# author这个字段是一个虚拟字段 不能在表中展示出来 仅仅是起到一个告诉orm建立第三张表的关系的作用
class Publish(models.Model): # 出版社表
title = models.CharField(max_length=32)
email = models.EmailField()
class Author(models.Model): # 作者表
name = models.CharField(max_length=32)
age = models.IntegerField()
author_detail = models.OneToOneField(to='Author_detail') # 一对一
class Author_detail(models.Model): # 作者详情表
phone = models.BigIntegerField()
addr = models.CharField(max_length=32)
注意:
時間対多の同期データテーブルのフィールドに作成した外部キー・フィールドが自動的に追加されますサフィックス_id
追加プラスまだ_id ORM場合は
とてもスマートになろうとしていないプラス_id
ライフサイクルフローチャートジャンゴ要求が
ポストジャンゴを確認するための最良の方法です
urls.pyルーティング層
長い正規表現は、コンテンツビュー機能に合わせることができるように下がり、すぐに実行され、試合を続行しませんよう、最初のパラメータのURLの正規表現です
ルーティング試合
# 取消django自动让浏览器加斜杠的功能
APPEND_SLASH = False # 该参数默认是True
from app01 import views
urlpatterns = [
url(r'^admin/',admin.site.urls), # url第一个参数是一个正则表达式
url(r'^test/$',views.test), # 一旦正则表达式能够匹配到内容 会立刻结束匹配关系 直接执行后面对应的函数
url(r'^testadd/$',views.testadd),
]
# django匹配路由的规律
# 不加斜杠 先匹配一次试试 如果匹配不上 会让浏览器重定向 加一个斜杠再来一次 如果还匹配不上 才会报错
ルート一致する値がURLセクションに一致するパラメータを運ぶために戻って取得する?一致していません
不明なパケット:パケット転送パラメータビューに位置の関数としての正規表現の内容と一致するように、
url(r'test/([0-9]{4})/',views.test)
test() takes 1 postition argument but 2 were given
# 当你的路由中有分组的正则表达式 那么在匹配到内容
# 执行视图函数的时候 会将分组内正则表达式匹配到的内容当作位置参数传递给视图函数 test(request,分组内正则表达式匹配到的内容)
よく知られているグループ:キーワード引数はビュー関数に渡される正規表現のグループに一致させるには、コンテンツになります
url(r'^testadd/(?P<year>\d+)/',views.testadd),
testadd() got an unexpected keyword argument 'year'
# 当你的路由中有分组并且给分组起了别名 那么在匹配内容的时候
# 会将分组内的正则表达式匹配到的内容当作关键字参数才能给视图函数 testadd(request,year=分组内正则表达式匹配到的内容)
有名無名のグループを使用して、我々は、機能のビューを呼び出す前に、関数に追加のパラメータを渡すことができます
質問:私は不明と有名なを混在することはできますか???
url(r'^index/(\d+)/(?P<year>\d+)/', views.index),
不能混合使用!!!
但是同一种分组的情况下 可以使用多次
无名可以有多个
有名可以有多个
但是就是不能混合使用
url(r'^index/(\d+)/(\d+)/', views.index),
url(r'^index/(?P<args>\d+)/(?P<year>\d+)/', views.index),
逆引き参照
別名によれば==動的分析結果の結果は直接、対応するURLにアクセスすることができる==
最初のケース
のルーティングが死に直接書き込まれた正規表現ではありません
url(r'^home/',views.home,name='xxx'), # 给路由与视图函数对应关系起别名
フロントエンドの分析イントロスペクション{% url ‘xxx’ %}
バックエンド逆引き参照
from django.shortcuts improt render,HttpResponse,redirect,reverse
url = reverse("xxx")
後者の場合
は、手動であるものに正規表現マッチングを指定する必要があるときに逆解析し、未知のパケットを検索
url(r'^home/(\d+)/',views.home,name='xxx'), # 给路由与视图函数对应关系起别名
フロントエンド逆引き参照
<p><a href="{% url 'xxx' 12 %}">111</a></p>
<p><a href="{% url 'xxx' 1324 %}">111</a></p>
<p><a href="{% url 'xxx' 14324 %}">111</a></p>
<p><a href="{% url 'xxx' 1234 %}">111</a></p>
バックエンド逆引き参照
url = reverse('xxx',args=(1,))
url1 = reverse('xxx',args=(3213,))
url2 = reverse('xxx',args=(2132131,))
# 手动传入的参数 只需要满足能够被正则表达式匹配到即可
第三の場合は
、パケットを解析する際に有名な手動で内容がどのような一致を指定する必要があり、ルックアップリバース
逆解析は同じ有名な匿名グループにグループ化することができ
ますが、ほとんどの正式な書面
url(r'^home/(?P<year>\d+)/', views.home,name='xxx'), # 给路由与视图函数对应关系起别名
フロント
# 可以直接用无名分组的情况
<p><a href="{% url 'xxx' 12 %}">111</a></p>
# 你也可以规范写法
<p><a href="{% url 'xxx' year=1232 %}">111</a></p> # 了解即可
バックエンド
# 可以直接用无名分组的情况
url = reverse('xxx',args=(1,))
# 你也可以规范写法
url = reverse('xxx',kwargs={'year':213123}) # 了解即可
編集機能には、例えば
url(r'^edit_user/(\d+)/',views.edit_user,name='edit')
def edit_user(request,edit_id):
# edit_id就是用户想要编辑数据主键值
pass
{% for user_obj in user_list %}
<a href='/edit_user/{{user_obj.id}}/'>编辑</a>
<a href='{% url 'edit' user_obj.id %}'>编辑</a>
{% endfor %}
ルートの配布
前提
Djangoアプリケーションのすべての中には、独自の独立したurls.pyテンプレートの静的を持つことができ
ますが、完全に超えて行わ非干渉パケットを開発するためのDjangoの開発プロジェクトを使用することができますので、上記の機能を
ちょうどあなた自身のアプリを開発し、誰も
グループリーダーは唯一の空の内部のDjangoプロジェクトに統合され、すべてのためのアプリケーションを開発するために必要な
大規模なプロジェクトで一緒にステッチ完了するために、より多くのアプリに統合され、その後再登録ルートの配布を使用してプロファイル設定を
総経路があまりにも多くの関係を一致させる場合を解決するためにルート分布プロジェクトであります
ルートの分布を用いて全ルートはもはやライブ試合を行いませんが、単にタスク分散を行うために(あなたがアクセスアプリの機能にしたいということだけ尋ねる間の総ルーティング対応を行うための要求は、対応するアプリケーションに要求を処理します後)
from app01 import urls as app01_urls
from app02 import urls as app02_urls
urlpatterns = [
url(r'^admin/', admin.site.urls), # url第一个参数是一个正则表达式
# 路由分发
url(r'^app01/',include(app01_urls)), # 路由分发需要注意的事项 就是总路由里面不能以$结尾
url(r'^app02/',include(app02_urls)),
]
# 子路由
from django.conf.urls import url
from app01 import views
urlpatterns = [
url('^reg/',views.reg)
]
from django.conf.urls import url
from app02 import views
urlpatterns = [
url('^reg/',views.reg)
]
# 最省事的写法(******)
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls'))
名前空間
各アプリに分散ルーティングあなたがやっているエイリアスが最後に解決さ逆にするときに、その名前空間のエイリアスを見つける選択することができます名前空間を作成することができますので、複数のアプリが競合する場合に表示されたら
url(r'^app01/',include('app01.urls',namespace='app01')),
url(r'^app02/',include('app02.urls',namespace='app02'))
# 后端
print(reverse('app01:reg'))
print(reverse('app02:reg'))
# 前端
<a href="{% url 'app01:reg' %}"></a>
<a href="{% url 'app02:reg' %}"></a>
実際には、名前空間の知識の上に完全に競合がDjangoのプロジェクトにはできません全体のエイリアスはあなただけの時間が必要であることを保証することはできません
アプリケーション名の接頭辞で結合された同じエイリアスから基準案
urlpatterns = [
url(r'^reg/',views.reg,name='app02_reg')
]
urlpatterns = [
url('^reg/',views.reg,name='app01_reg')
]
擬似静的
SEO検索エンジンのクエリの頻度と強度のウィッシュリストを向上させるために、静的なWebページを装った動的なWebページ
いわゆる検索エンジンません、実際に巨大な爬虫類
その後、悪化し最適化された到着したが、それでも人民元の選手
仮想環境
モジュールへのモジュールは、プロジェクトに必要な機器のすべての項目を必要とせず、インストールされません
それぞれの再ダウンロード純粋なPythonインタプリタにあなたに似た仮想環境を作成します
(Nは、単一のマシン上で複数の仮想環境を持つことができます)をインストールするために使用したもの上記のプロジェクトの後に
あなたのマシン上で無制限の仮想環境を作成しないでください
Djangoのバージョンの違い
django1.X django2.X
パスを使用しdjango2.X
urlpatterns = [
path('admin/', admin.site.urls),
]
URLを使用django1.X
urlpatterns = [
url(r'^reg.html',views.reg,name='app02_reg')
]
# 区别 django2.X里面path第一个参数不是正则也不支持正则 写什么就匹配什么
# 虽然path不支持正则 感觉也好用 django2.X还有一个re_path的方法 该方法就是你django1.X里面url
# 虽然path支持 但是它提供了五种转换器 能够将匹配到的数据自动转黄成对应的类型
# 除了有默认五种转换器之外 还支持你自定义转换器
ビューレイヤー
ファイルは、ファイルバックエンドを取得アップロードするフォームを形成する方法
ファイルをアップロードするためのフォームが注意を払うのに必要なフォーム
1.methodは、POSTに変更する必要があります
FORMDATAにフォーマット2.enctype
ミドルウェアCSRFの必要性からコメントを要求するときに初期の頃では、設定のコンフィギュレーションファイルに移動するには、後端に向けてポストを使用します