ディレクトリ
ORMはテーブル関係を確立します
テーブルのリレーションシップを決定する方法:共感を、上記の分析の前にテーブルの上に立って、分析は、別のテーブルの上に立って、そして最終的に組み合わせ
マンツーマン
、任意でテーブルの外部キーフィールドを作成し、より高い周波数のクエリのパーティーに外部キーの推奨事項を追加
# 关键字OneToOneField
author_detail = models.OneToOneField(to='Author_detail') # 外键本质fk + unique
多くの
そのマルチパーティで作成した外部キーフィールド
# 关键字ForeignKey
publish = models.ForeignKey(to='Publish') # to用来指代跟哪张表有关系 默认关联的就是表的主键字段
# 外键字段名在创建时会自动加上_id后缀
多くの多くの
外部キー関係がに対処するための第三のテーブルを作成する必要があります。
# 关键字ManyToManyField
author = models.ManyToManyField(to='Author')
# django orm会自动帮你创建第三张关系表,表名为两个关联的表名用_连接
Djangoのリクエストのライフサイクル
URLルーティング層
urlpatterns = [url(r'^admin/', admin.site.urls),]
最初のパラメータは、正規表現のURLである限り、正規表現は、コンテンツに合わせることができるよう、もはや試合をダウン続け、ビュー関数の直後に実行されません。
ルーティング試合
デフォルトの設定ではDjangoのsettings.pyファイルAPPEND_SLASH = True
。その役割は、自動的にURLの末尾に追加されました「/」。
あなたはブラウザが自動的ジャンゴスラッシュ機能を解除できるようにしたい場合は、必要手動での書き込みにAPPEND_SLASH = False
ジャンゴルートマッチングルール:
- まず、試しに一致するように、スラッシュではありません
- 試合が終わっていない場合は、もう一度、最終一致スラッシュURL、ブラウザをリダイレクトします
- あなたはまだエラーに一致しない場合
- GET要求と一致しない
?
リア運ばパラメータを
不明グループ
などのコンテンツにパケットを正規表現マッチング位置パラメータは、ビュー関数に渡さ
url(r'^test/([0-9]{4})/', views.test)
# 当你的路由中有分组的正则表达式 那么在匹配到内容
# 执行视图函数的时候 会将分组内正则表达式匹配到的内容当做位置参数传递给视图函数
def test(request,xxx):
'''
此时url有第二个参数,会传递给视图函数位置参数传进来。
如果不写接收的位置参数则会报错
test() takes 1 positional argument but 2 were given
'''
print(xxx) # 会接收到url中的数字
pass
有名なグループ化
などのコンテンツにパケットをマッチする正規表現のキーパラメータは、ビュー関数に渡されます
url(r'^test/(?P<year>[0-9]{4})/', views.test)
# 当你的路由中有分组的正则表达式 那么在匹配到内容
# 执行视图函数的时候 会将分组内正则表达式匹配到的内容当做关键字参数传递给视图函数
def test(request,year):
'''
此时url有第二个参数,会传递给视图函数关键字参数传进来。
如果不写接收的关键字参数则会报错
testadd() got an unexpected keyword argument 'year'
'''
print(year) # 会接收到url中的数字,以关键字参数形式显示
pass
有名無名のグループを使用して、我々は、機能のビューを呼び出す前に、関数に追加のパラメータを渡すことができます
注:無名のグループ化と有名なグループ化は、混在させることはできません
パケットが、同一の場合は、よく知られているが複数存在してもよい、すなわち、複数の未知の存在であってもよいし、複数回使用することができます
逆引き参照
ルーティングは別名、直接対応するURLにアクセスすることができる動的解析結果に応じて、エイリアスと一致するように設けられています。
自由な状態でケースに一致分析用逆ルーティングパケット
# urls.py:
url(r'^home/',views.home,name='hm'),
url(r'^index/$',views.index),
# views.py:
def home(request):
return HttpResponse(reverse('hm'))
def index(request):
print(reverse('hm')) # /home/
return render(request,'test.html')
# test.html:
<a href="{% url 'hm' %}">点我</a>
# 当我们在浏览器URL输入http://127.0.0.1:8000/index/的时候,
# python后端进行reverse反向解析成 别名为'hm'的路径前缀,也就是home路径,
# 用test.html 页面渲染,html也可以使用反向解析
# python后端使用反向解析:
reverse('hm')
# 前端html使用反向解析:
{% url 'hm' %}
# 将路径解析为/home/。
のグループ化分析用逆不明
# urls.py:
url(r'^home/(\d+)/',views.home,name='hm'),
url(r'^index/',views.index),
# views.py:
def home(request,xxx):
# 使用无名分组,视图函数必须写位置参数
print(xxx)
return HttpResponse('ok')
def index(request):
print(reverse('hm',args=(1,)))
# 无名分组需要手动给别名传递一个参数才能匹配上,这个参数会传递到视图函数当做位置参数。
return render(request,'test.html')
# test.html:
<a href="{% url 'hm' 1 %}">点我点我</a>
'''当一个无名分组使用别名的时候,在浏览器URL输入http://127.0.0.1:8000/index/,python后端进行reverse反向解析成 别名为'hm'的路径前缀,也就是home路径,需要手动给解析出来的路径加参数,不然匹配不成功
用test.html 页面渲染,并且html使用反向解析,也需要手动传入参数'''
# python后端使用反向解析:
reverse('hm',args=(1,))
# 前端html使用反向解析:
{% url 'hm' 1 %}
# 将路径解析为/home/1。
逆引き有名なグループ化
# urls.py:
url(r'^home/(?P<year>\d+)/',views.home,name='hm'),
url(r'^index/',views.index),
# views.py:
def home(request,year):
# 使用有名分组,视图函数必须写关键字参数
print(year)
return HttpResponse('ok')
def index(request):
print(reverse('hm',args=(1,))) # 这样也可以,但不正规
print(reverse('hm',kwargs={"year":1}))
# 最正规的写法,因为有名分组传入的是关键字参数,用kwargs参数来表示
return render(request,'test.html')
# test.html:
<p><a href="{% url 'hm' 1 %}">点我点我</a></p> # 这样也可以,但不正规
<p><a href="{% url 'hm' year=1 %}">点我点我</a></p>
# 最正规的写法,因为有名分组传入的是关键字参数
'''当一个无名分组使用别名的时候,在浏览器URL输入http://127.0.0.1:8000/index/,python后端进行reverse反向解析成 别名为'hm'的路径前缀,也就是home路径,需要手动给解析出来的路径加参数,不然匹配不成功。
用test.html 页面渲染,并且html使用反向解析,也需要手动传入参数'''
# python后端使用反向解析:
reverse('hm',kwargs={"year":1})
# 前端html使用反向解析:
{% url 'hm' year=1 %}
# 将路径解析为/home/1。
例
編集ユーザー情報への擬似コードは、例えば、特定の使用方法を示します。
# urls.py:
url(r'^edit_user/(\d+)',views.edit_user,name='edit'),
# views.py:
def edit_user(request,edit_id):
...
# edit_id 就是用户想要编辑数据的主键值
return render(request,'edit_user.html',{"user_list":user_list})
# edit_user.hmtl:
{% 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 # 或者以app名为前缀,避免重复
urlpatterns = [
url(r'^app01/',include(app01_urls)),
url(r'^app02/',include(app02_urls)),
]
# 第二种方法
urlpatterns = [
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>
# 参考建议
# 起别名的时候统一加上应用名前缀,这样你的别名就不会重复了。
urlpatterns = [url(r'^reg/',views.reg,name='app01_reg')]
urlpatterns = [url(r'^reg/',views.reg,name='app02_reg')]
擬似静的
サイトの視認性を向上させるために、検索エンジンのSEOのウィッシュリストのクエリ頻度と強度を向上させるために、静的なWebページを装った動的なWebページ
# 直接在urls后面手动加上.html
url(r'^article/(\d+).html',views.article)
仮想環境
仮想環境は、仮想環境でのプロジェクトの後に、何が必要、システムソフトウェアに存在するが、競合環境ません、何かをインストールするには、再ダウンロード純粋なPythonインタプリタと同等です。
Djangoのバージョンの違い
urls.pyマッチング異なるルーティング方法。
ジャンゴ1.X
urlは、対応する正規表現をurlpatterns
from django.conf.urls import url
urlpatterns = [
url = ('test',view.test)
]
ジャンゴ2.X
最初の引数のパスは正規表現をサポートしていない、彼は唯一のエラーに一致しないものと一致することができるものを書きました。
ジャンゴ2.xでは、そこにあるre_path
)(1.XバージョンのURLである方法
from django.urls import path,re_path
urlpatterns = [
path = ('test',view.test),
re_path = (r'^test/(\d+)',view.test)
]
ジャンゴ2.Xバージョンも、5つのコンバータを提供します
- STR:文字列パスセパレータ/外部に一致することに加えて
- INT:自然数の一致
- スラグ:文字列照合文字、数字、およびアンダースコアバー
- UUID:マッチングデータのUUID形態
- パス:パス区切りを含む、任意の文字列にマッチ/
urlpatterns = [
path = ('test/<str:\d+>',view.test)
path = ('test/<int:\d+>',view.test)
path = ('test/<slug:\d+>',view.test)
path = ('test/<uuid:\d+>',view.test)
path = ('test/<path:\d+>',view.test)
]
内蔵のコンバータ5に加えて、あなたはまた、独自のコンバータをカスタマイズすることができます。
- アプリケーションフォルダ内converter.pyファイルの作成
- converter.pyでのカスタムクラスファイルを作成します。
- クラスで定義されているが、通常のregexで、to_python方法、to_url方法
class CVT185Phone:
regex = '185\d{8}'
def to_python(self, value):
return int(value)
def to_url(self, value):
return '%11d' % value
from django.urls import register_converter
from app.converter import CVT185phone
register_converter(CVT185phone,'phone185')
path('page/<phone185:msg>/',views.page,name="pages")
ファイルをアップロードするためのフォームを形成します
ルート配布により、利用機能のapp01アップロードファイルは、ファイルをアップロードします。
# mysite/urls.py
urlpatterns = [
url(r'^app01/',include('app01.urls')),
]
# app01/urls.py
from app01 import views
from django.conf.urls import url
urlpatterns = [
url(r'^upload/',views.upload,name='app01_upload'),
]
# app01/views.py
def upload(request):
if request.method == "POST":
# print(request.FILES)
file_obj = request.FILES.get("myfile")
with open(file_obj.name,"wb") as f:
for i in file_obj:
f.write(i)
return render(request,'upload.html')
# templates/upload.html
<form action="" method="post" enctype="multipart/form-data">
# from表单上传文件,必须要修改的参数 enctype="multipart/form-data"
请选择文件
<input type="file" name="myfile">
<input type="submit" class="btn btn-primary">提交
</form>