模闆的繼承:
文法:
在父模闆中
必須要辨別出那些内容在子模闆中允許為修改
{% block 名稱 %}
{% endblock %}
在子模闆中
指定繼承自那個父模闆
{% extends '父模闆名稱' %}
增加block标簽 改寫屬于自的内容
block的作用:
在父模闆中正常顯示
在子模闆中 如果不修改的話 則按父模闆的内容顯示
要是修改的話則按照子模闆的内容顯示
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>{% block title %}天天果園-會員登入{% endblock %}</title>
<link rel="stylesheet" href="/static/css/login.css">
{% block style %}
{% endblock %}
</head>
<body>
<div id="container">
<!-- 上 :會員登入 -->
<h2>{% block header %}會員登入{% endblock %}</h2>
<!-- 下左:登入圖像 -->
<p>
<img src="/static/images/huiyuan.jpg">
{% block anchor %}
<a href="{% url 'register' %}">會員注冊></a>
{% endblock %}
</p>
<!-- 下右:登入表單 -->
{% block from %}
<div id="login">
<form action="login" method="post">
<!-- 第一行:手機号 -->
<div class="form-line">
<p>手機号</p>
<div>
<input type="text" name="uphone" class="form-control">
</div>
</div>
<!-- 第二行:密碼 -->
<div class="form-line">
<p>密碼</p>
<div>
<input type="password" name="upwd" class="form-control" placeholder="請輸入密碼">
</div>
</div>
<!-- 第三行:記住密碼,忘記密碼-->
<div class="form-line">
<p></p>
<div>
<!-- 右浮動 -->
<p>
<a href="#">忘記密碼</a>
<a href="#">快捷登入</a>
</p>
<!-- 不浮動 -->
<input type="checkbox" name="isSaved" class="isSaved" checked>記住密碼
</div>
</div>
<!-- 第四行:登入按鈕-->
<div class="form-line">
<p></p>
<div>
<!-- 右:超連結 -->
<a href="#" class="goReg">注冊會員</a>
<!-- 左:登入按鈕 -->
<input type="submit" value="登入" class="btnLogin">
</div>
</div>
</form>
</div>
{% endblock %}
</div>
</body>
</html>

利用注冊繼承登入的模闆 這樣就可以直接使用登入界面的樣式
把想修改的的不笨用繼承的方式進行修改就可以
{% extends "login.html" %}
{% block style %}
<style>
#login{
margin-top: 20px;
}
</style>
{% endblock %}
{% block title %}
天天果園.會員注冊
{% endblock %}
{% block header %}
會員注冊
{% endblock %}
{% block anchor %}
<a href="{% url 'login' %}">會員登入</a>
{% endblock %}
{% block from %}
<div id="login">
<form action="login" method="post">
<!-- 第一行:手機号 -->
<div class="form-line">
<p>手機号</p>
<div>
<input type="text" name="uphone" class="form-control">
</div>
</div>
<!-- 第二行:密碼 -->
<div class="form-line">
<p>密碼</p>
<div>
<input type="password" name="upwd" class="form-control" placeholder="請輸入密碼">
</div>
</div>
<!-- 第三行:确認密碼 -->
<div class="form-line">
<p>确認密碼</p>
<div>
<input type="password" name="cpwd" class="form-control" placeholder="确認密碼">
</div>
</div>
<!-- 第四行:使用者名 -->
<div class="form-line">
<p>使用者名</p>
<div>
<input type="password" name="uname" class="form-control" placeholder="使用者名">
</div>
</div>
<!-- 第五行:郵箱 -->
<div class="form-line">
<p>使用者名</p>
<div>
<input type="password" name="email" class="form-control" placeholder="郵箱">
</div>
</div>
<!-- 第六行:登入按鈕-->
<div class="form-line">
<p></p>
<div>
<!-- 右:超連結 -->
<a href="#" class="goReg">會員登入</a>
<!-- 左:注冊按鈕 -->
<input type="submit" value="注冊" class="btnLogin">
</div>
</div>
</form>
</div>
{% endblock %}
re_path的name參數:
re_path(regex, views, kwargs=None, name=None)
name:為了給目前URL位址起别名的 主要用于URL的反向解析時使用
反向解析:
通過别名找到對應的位址
re_path(regex, views, kwargs=None, name="别名")
在模闆中反向解析:
1.基本解析
{% url "别名" %}
2.帶參數解析
{% url "别名" "參數1" "參數2"... %}
urlpatterns = [
re_path(r"^login/$", login_views, name="login"),
]
<a href="{% url 'login' %}">會員登入</a>
在視圖中反向解析:
url = reverse("别名")
url就是通過别名解析出來的位址
2.帶參數解析:
url = reverse("别名", args=(參數1, 參數2...))
def reverse_views(request):
# url = reverse("login")
url = reverse("arguments", args=("2018", "07"))
return HttpResponse("解析的位址為:" + url)
模型 Models:
什麼是模型?
根據資料庫表建立出來的class
ORM三大特征:
表到類的映射
資料類型的映射
關系的映射
建立資料庫:
create database webdb default charset utf8 collate utf8_general_ci;
資料庫的配置:
setting.py中配置資料庫資訊
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
連結到mysql
ENGINE:mysql:django.db.backends.mysql
NAME:連接配接到的資料庫名
USER:登入到資料庫的使用者名
PASSWORD:登入到資料庫的密碼
HOST:連接配接到的主機位址
PORT:指定端口 MySQL預設3306
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "webdb",
"USER": "root",
"PASSWORD": "ParisPython",
"HOST": "localhost",
"PORT": 3306
}
}
資料庫的同步操作:
./manage.py makemigrations
作用:
将每個應用下的models.py檔案生成一個資料庫的中間檔案
并将中間檔案儲存在 migrations的目錄中
./manage.py migrate
将每個應用中的migrations目錄中的中間檔案同步到資料庫
編寫Models:
示例:
from django.db import models
# Create your models here.
# 在index應用中的models.py中
# 建立一個實體類
# Publisher
# 用于表示出版社
class Publisher(models.Model):
# 屬性如下
# name:出版社的名稱(varchar)
name = models.CharField(max_length=30)
# address:出版社所在位址(varchar)
address = models.CharField(max_length=200)
# city:出版社所在城市(varchar)
city = models.CharField(max_length=50)
# country:出版社所在國家(varchar)
country = models.CharField(max_length=50)
# website:出版社網站(varchar
website = models.URLField
class Author(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
email = models.EmailField(null=True)
# True表示使用者的激活狀态
# 由于是新增列 是以必須要給預設值後允許為空
# 由于BlooeanField預設值是不允許為空的 是以此處選擇增加預設值
isActive = models.BooleanField(default=True)
class Book(models.Model):
title = models.CharField(max_length=50)
publicate_data = models.DateField()
Models的文法規範:
class ClassName(models.Model):
屬性 = models.字段類型(字段選項)
字段類型:映射到資料庫表中的資料類型
CharField() -varchar
字段選項:
max_length=30
字段類型(Filed Type):
BooleanField()
程式設計語言中用True和False表示該列的值
資料庫中使用1和0來表示具體的值
資料類型為:tinyint
CharField()
字元串
資料類型為是varchar
DataField()
程式設計語言中使用字元串或data類型的資料表示值
資料庫中使用時間和字元串
資料類型為:data 日期時間
DatetimeField()
資料類型為:datetime 精确到十分秒
DecimalField()
資料類型為decimal
money = models.DecimalField(max_digits=7, decimal_places=2)
FloatField()
資料類型為float
IntegerFiled()
資料類型為:int
EmailField()
資料類型:varchar
URLField()
資料類型為:varchar
ImageFiled()
存儲圖檔的路徑
資料類型為varchar
image = models.ImageField(upload_to="images/users")
字段選項(Field options):
default
為目前字段指定預設值
null
指定目前字段是否允許為空 預設為False
primary_key
指定是否為主鍵
db.column
指定目前字段映射到清單中類的名字
如果不指定采用屬性名作為字段名
相關指令:
通過資料庫自動導出models
./manage.py inspectdb > 檔案名.py
資料的版本切換
./manage.py migrate
執行所有應用中最新版本的資料庫中間檔案
./manage.py migrate 應用名稱 版本号
執行指定應用中的指定版本的中間檔案
./manage.py migrate index 0002