Python全栈 Web(Django框架、模板继承、模型)

模板的继承:
    语法:
        在父模板中
          必须要标识出那些内容在子模板中允许为修改
          {% block 名称 %}
          {% endblock %}
        在子模板中
          指定继承自那个父模板
          {% extends '父模板名称' %}
          增加block标签 改写属于自的内容
          {% block 名称 %}
          {% endblock %}


        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>


        在视图中反向解析:
            1.基本解析
                url = reverse("别名")
                url就是通过别名解析出来的地址
            2.带参数解析:
                url = reverse("别名", args=(参数1, 参数2...))
                url就是通过别名解析出来的地址



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