天天看點

Python全棧 Web(Django架構、模闆繼承、模型)

模闆的繼承:

    文法:

        在父模闆中

          必須要辨別出那些内容在子模闆中允許為修改

          {% 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>
           
Python全棧 Web(Django架構、模闆繼承、模型)

利用注冊繼承登入的模闆 這樣就可以直接使用登入界面的樣式

把想修改的的不笨用繼承的方式進行修改就可以

{% 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 %}           
Python全棧 Web(Django架構、模闆繼承、模型)

    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