[TOC]html
QQ: 基本經常使用展現信息<==>更多信息, 節省數據查詢時間前端
一對一關係的兩張表能夠拼成一張表, 反之一張表也能拆成兩張一對一的表python
外鍵設定在一對多中多的一方, 建立表時必須先建立沒有外鍵約束的表git
多對多的外鍵設定在關係表中正則表達式
# 先創基表再考慮外鍵關係 class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=8, decimal_places=2) publish = models.ForeignKey(to='Publish') # 創建出版社與書的一對多關係, 默認關聯主鍵字段 """ 1. 創建書與做者的多對多關係, 建議外鍵建在查詢頻率高的一方 2. django orm會自動建立二者之間的關係表 3. author字段是一個虛擬字段, 不會在表中展現 """ author = models.ManyToManyField(to='Author') 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='AuthorDetails') # author_detail = models.ForeignKey(to='AuthorDetails', db_constraint='unique') # fk + unique class AuthorDetails(models.Model): phone = models.BigIntegerField() address = models.CharField(max_length=32) # 外鍵字段同步到數據庫中會自動加"_id"
url(r'^test/([0-9]{4})/', views.test)
test(request, x)
url(r'^test_add/(?P<y>\d+)/', views.test_add)
test_add(request, y)
url(r'^index/(\d+)/(?P<y>\d+)/', views.index)
, 報錯url(r'^index/(\d+)/(\d+)/', views.index)
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'test/', views.test), url(r'test_add/', views.test_add), ] """ 1. url第一個參數是一個正則表達式, 2. 會與處理獲得的前端url路徑後綴字符串進行匹配, 3. 一旦匹配到內容, 會馬上結束匹配關係, 執行第二個參數對應的函數 """
1.django匹配路由的規律:數據庫
2.取消django自動讓瀏覽器加斜槓的功能: settings-->APPEND_SLASH = False
django
3.url(r'^test/$', views.test)
, 限制後綴名只能輸入test/, $視狀況添加後端
4.路由匹配只匹配url部分, 不匹配?後面get請求攜帶的參數瀏覽器
根據一個別名, 動態解析出一個結果,app
該結果能夠直接訪問對應的url,
多<==>一<==>一
url(r'^home/', views.home,name='xxx')
, 多: 動態變化的url; 一: xxx;
前端反向解析: <a href="{% url 'xxx' %}">111</a>
後端反向解析:
def get_url(request): url = reverse('xxx') print(url) return redirect(url)
訪問/index/, 報錯: Reverse for 'xxx' with no arguments not found. 1 pattern(s) tried: ['home/(\d+)/']
前端反向解析: <a href="{% url 'xxx' 1 %}">111</a>
,
在解析的時候, 須要指定無名分組內的正則匹配表達式匹配的內容
後端反向解析: reverse('xxx', args=(1, ))
urlpatterns = [ url(r'^index/', views.index), url(r'^home/(\d+)/', views.home, name='xxx'), url(r'^get_url/', views.get_url), ] def index(request): return render(request, 'index.html') # <p><a href="{% url 'xxx' 1 %}">111</a></p> # 數字一般是數據的主鍵值 def home(request, x): return HttpResponse([x, 'home']) def get_url(request): url = reverse('xxx', args=(1, )) print(url) return redirect(url)
前端反向解析: <a href="{% url 'xxx' yyy=1 %}">111</a>
,
在解析的時候, 須要指定有名分組內的正則匹配表達式匹配的內容
後端反向解析: url = reverse('xxx', kwargs={'yyy': 1})
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 %} """
from django.conf.urls import url, include from app01 import urls as app01_urls from app02 import urls as app02_urls urlpatterns = [ url(r'^app01/', include(app01_urls)), # 注意: 總路由裏面不能以$結尾 url(r'^app02/', include(app02_urls),) ] # 精簡寫法, 不須要導入, url(r'^app01/', include('app01.urls')),
from django.conf.urls import url from app01 import views urlpatterns = [ url('^reg/', views.reg) ]
前端: <a href="{% url 'app01:reg' %}"></a>
後端: reverse('x:reg')
# 總路由 urlpatterns = [ url(r'^app01/', include('app01.urls', namespace='x')), url(r'^app02/', include('app02.urls', namespace='y')), ] # 兩個子路由 urlpatterns = [ url('^reg/', views.reg, name='reg') ] # 視圖函數 def reg(request): url = reverse('x:reg') print(url) return HttpResponse('app01 reg')
url('^reg/', views.reg, name='app01_reg')
<form action="" method="post" enctype="multipart/form-data"> <input type="file" name="my_file"> <input type="submit"> </form>
def upload_file(request): if request.method == 'POST': print(request.FILES) # <MultiValueDict: {'my_file': [<TemporaryUploadedFile: test.pdf (application/pdf)>]}> file_obj = request.FILES.get('my_file') # 獲取列表中最後一個元素 print(file_obj) # test.pdf, __str__控制打印值 print(file_obj.name) # test.pdf with open(file_obj.name, 'wb') as fw: for line in file_obj: fw.write(line) return render(request, 'upload.html')