文章目錄
前言 ´・ᴗ・`
- 本節帶你真正做出自己的主頁 而不是停留在後臺管理
- 本篇內容將會幫助你學習…
- 1 定義設置url跳轉資源
- 2 構建整個網站的基本骨架
- 3 瞭解view.py url.py的使用
- 4 製作主頁
url參數
百度關鍵詞的時候 我們看到我們的搜索詞跑到了地址欄
前面文章說過
- 這是動態網站 可以以一個模板適應無數的請求(搜索詞變了 模板不變 只是搜索結果變了)
- 這是get方法
- 這是url屬性(url的參數部分)
有沒有感到好奇 爲啥網站能夠做到這些?我們該怎麼做?
制定url規則
首先 你得在url.py
制定你的url規則
百度制定的規則是:\wd = <string>
string部分就是任何搜索詞
意思 服務器將響應這類www.baidu.com\wd=
形式的url 當然 是get方式
當然怎麼響應 在django 就是view.py
乾的事了
baidu相應這類請求的結果 就是你看到的一個個網站導航
於是 我制定 我的圖書館demo就是下面這些規則:
- catalog/ — 主頁
- catalog/books/ — 書單頁
- catalog/authors/ — 作者頁
- catalog/book/ — 主鍵字段 ID的具體書(默認) —詳細視圖。
如 /catalog/book/3,第三本書。 - catalog/author/ — 主鍵字段 ID的具體作者(默認) —詳細視圖。
如 /catalog/author/11,第11個作者。
真正訪問 你就可以這麼寫:http://<你的域名>/catalog/
比如我的就是:http://47.112.174.246:3389/catalog/
這個是可用的 你可以試試 我弄了個服務器開着來調試玩着ヾ(≧▽≦*)o
接下來 你還需要制定規則:服務器該怎麼響應
響應的函數在view.py 裏面
然後響應的內容在template 意思 html的模板
模板是什麼?百度你怎麼搜索 模板都是一堆網址導航 的樣式
我們也是這樣
總結起來
- 制定url規則 url.py
- 制定服務器響應規則 view.py
具體來說 服務器幫你鏈接模板 填上數據庫的數據(render函數)
然後返回給瀏覽器 - 製作html 模板
制定url規則
也可以說是 創建 url 到訪問資源的一一映射
在catalog/url.py 中 內容改成這樣:
#-*- utf-8 -*-
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
對 你猜的沒錯 urlpatterns 這個列表放着所有url映射
包含幾個參數:
- ’ ’ 利用正則表達式匹配的模式 這裏爲空就說明 沒有任何參數 這就是主頁index的響應方式
- view.index 我說過 響應規則放view裏面了 這是個view的函數 專門用來負責響應 針對主頁的請求的
你沒猜錯 待會兒我們還要編輯這個規則 這個函數 - name=‘index’ 這條url規則的名字 —— 爲啥要有名字?
我們後面 要通過名字引用的!
比如 我們這裏是url ——> 資源 如果有一次 我們客戶想要獲取url怎麼辦?這時需要逆向(reverse)
就需要這個url映射名字
什麼時候需要獲取url?
我們html模板會這麼寫
<a href="{% url 'index' %}">Home</a>.
這句意思 這個Home超鏈接到當前頁 你看他直接用index這個url映射的名字
當然你可以牛掰的寫上:
<a href="/catalog/">Home</a>
這就是 硬編碼(hard code) 這樣寫死的後果就是 假設你管理一個上個不同網頁的站點
你老闆說 所有url映射 不寫“catalog” 我要寫‘cxk’
這個時候 你可能會通宵的修改上百個html模板
而且 所有超鏈接你都這樣硬編碼 或許你得通幾個宵 然後哭暈在廁所(~ ̄▽ ̄)~
爲什麼我們操作catalog的url 而不是根目錄的url?
你可能會有疑問 爲啥不在根目錄的url.py 寫這句?如果用戶並不訪問catalog這個應用 直接訪問:
http://47.112.174.246:3389/
該怎麼辦?
事實上前面也說了 會將所有請求重定向到catalog去的
你可以點開 觀察地址欄的變化
意味着 catalog就是網站的主體了 所有url都基於
http://47.112.174.246:3389/catalog/
原因很簡單 我們這個網站很小 是個單應用的網站 因此一個應用承辦所有網站的請求
服務器如何響應——view.py
這裏難點 關鍵是調用ORM 你要連接html模板 你要鏈接數據庫(通過ORM數據模型)
在catalog\view.py 注意是catalog下面 這個應用的view
from .models import Book, Author, BookInstance, Genre
def index(request):
"""
View function for home page of site.
"""
# Generate counts of some of the main objects
num_books=Book.objects.all().count()
num_instances=BookInstance.objects.all().count()
# Available books (status = 'a')
num_instances_available=BookInstance.objects.filter(status__exact='a').count()
num_authors=Author.objects.count() # The 'all()' is implied by default.
# Render the HTML template index.html with the data in the context variable
return render(
request,
'index.html',
context={'num_books':num_books,'num_instances':num_instances,'num_instances_available':num_instances_available,'num_authors':num_authors},
)
複製粘貼過去
其實就幹了兩件事
- 一個是設計了個 可以統計數量的程序段 比如書的數量 作者數量等
- 二個是render 連接了名爲“index.html”的模板 並且傳參 book author等數據庫的數據過去
效果就類似:
模板的製作
我們的render會自動尋找 當前目錄下 template文件夾 去找html模板
因此 在catalog/template/新建 index.html:
我們這麼寫:
{% extends "base_generic.html" %}
{% block content %}
<h1>Local Library Home</h1>
<p>Welcome to <em>LocalLibrary</em>, a very basic Django website developed as a tutorial example on the Mozilla Developer Network.</p>
<h2>Dynamic content</h2>
<p>The library has the following record counts:</p>
<ul>
<li><strong>Books:</strong> {{ num_books }}</li>
<li><strong>Copies:</strong> {{ num_instances }}</li>
<li><strong>Copies available:</strong> {{ num_instances_available }}</li>
<li><strong>Authors:</strong> {{ num_authors }}</li>
</ul>
{% endblock %}
注意到 extends
沒有?
這個是 基於什麼拓展的意思 然後你發現 base_generic.html 我們都沒做
我們的思路就是 所有網頁模板 是基於base_generic 模板的 因爲很多東西還是重複了 比如<html><body>
等標籤
於是 我們再在創建 html模板的模板:)
/locallibrary/catalog/templates/base_generic.html
<!DOCTYPE html>
<html lang="en">
<head>
{% block title %}<title>Local Library</title>{% endblock %}
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<!-- Add additional CSS in static file -->
{% load static %}
<link rel="stylesheet" href="{% static 'css/styles.css' %}">
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-sm-2">
{% block sidebar %}
<ul class="sidebar-nav">
<li><a href="{% url 'index' %}">Home</a></li>
<li><a href="">All books</a></li>
<li><a href="">All authors</a></li>
</ul>
{% endblock %}
</div>
<div class="col-sm-10 ">
{% block content %}{% endblock %}
</div>
</div>
</div>
</body>
</html>
發現沒有?block content 也就是內容模塊 我們是空的 why?
你再看看我們主頁的內容:
沒錯!所有catalog的html模板 都是基於對content模塊的拓展
也就是 base_generic.html 就是網站的基本骨架——所有網頁都是大致這個樣式
其他html模板不過是對內容進行修改而已
可謂是html模板的模板
一般 我們設計就是從 網頁骨架backbone 開始設計的
當然 我們也可以修改其他模塊 只要兩句
- extends “base_generic.html”
- {{% block <你想修改的block名稱>%}}
最後 還需要添加一下css 顯得稍微好看點
/locallibrary/catalog/static/css/styles.css
.sidebar-nav {
margin-top: 20px;
padding: 0;
list-style: none;
}
render函數的運用
觀察下面兩幅圖
index.html:
view.py:
發現render函數的context字典 那一個個鍵值對 其實都真的映射到html模板中去了
就像之前說的 服務器幫我們往html上填值了
彩蛋
觀察一下:base_generic
這個index是不是有點眼熟?
這不就是url映射的那個名字嘛?!?
對了 映射名字的確是有暖用的:)
總結 ´◡`
runserver 來跑一下如何?
不出意外你會看到:‘’
當然 顯示的文字你都可以更改 問題不大
我們下一步操作就是針對網站的其他部分 包括 多用戶的管理 作者頁 書的介紹等等
-
想學習數據庫 打好後端基礎嘛? 不妨從MySQL入手
MySQL專欄 -
python這麼火 想要深入學習python 玩一下簡單的應用嘛?可以看我專欄 還在持續更新中哦:
python應用 -
小孩子才做選擇 大人全都要!對後端感興趣嗎?收下它吧:)
手把手帶你學後端(服務端) -
謝謝大佬支持! 萌新有禮了:)