1.Django的命令:
-
下载
-
pip install django==1.11.16
-
pip install django==1.11.16 -i 源
-
-
创建项目
-
django-admin startproject 项目名
-
-
启动项目
-
cd 项目目录下 找到manage.py
-
python manage.py runserver # 127.0.0.1:8000
-
python manage.py runserver 80 # 127.0.0.1:80
-
python manage.py runserver 0.0.0.0:80 # 0.0.0.0:80
-
-
创建一个APP
-
python manage.py startapp app名称
-
注册
-
-
数据库迁移
-
python manage.py makemigrations # 在app下的migrations文件夹下记录 models的变更记录
-
python manage.py migrate # 将models的变更记录同步到数据库中
-
2.Django的配置
-
注释一个CSRF的中间件 可以提交POST
-
databases 数据库
-
ENGINE : mysql
-
NAME : 数据库的名称
-
HOST:主机的IP
-
PORT:3306
-
USER: 用户名
-
PASSWORD: 密码
-
-
静态文件的配置
-
STATIC_URL = '/static/' # 别名
-
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static')
]
-
-
app
-
INSTALLED_APPS = [
'app01' ,
'app01.apps.App01Config'
]
-
-
TEMPLATES 模板相关的配置
-
DIRS [ os.path.join(BASE_DIR,'templates')]
-
3.Django使用mysql数据库的流程:
-
创建一个mysql数据库
-
在settings中进行配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'bookmanager',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': '',
}
} -
在与settings同级目录下的init的文件中写:
import pymysql
pymysql.install_as_MySQLdb() -
在app下的models中写类(models.Model)
class Publisher(models.Model): # app01_publisher
pid = models.AutoField(primary_key=True) # pid 主键
name = models.CharField(max_length=32, unique=True) # 出版社名称
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=32, unique=True) # 书籍的名称
publisher = models.ForeignKey('Publisher', on_delete=models.CASCADE) # 关联了出版社
def __str__(self):
return self.title
class Author(models.Model):
name = models.CharField(max_length=32, unique=True) # 作者的名字
books = models.ManyToManyField('Book') # 表示作者和书籍 多对多的关系
# books = models.ManyToManyField('Book', through='Author_book',) # 表示作者和书籍 多对多的关系
def __str__(self):
return self.name5.数据库迁移的命令
-
python manage.py makemigrations # 在app下的migrations文件夹下记录 models的变更记录
-
python manage.py migrate # 将models的变更记录同步到数据库中
-
4.ORM的对应关系
类 —— 》 表
对象 ——》 记录(数据行)
属性 ——》 字段
5.ORM操作
-
查询
-
models.Publisher.objects.all() # 查询所有的数据 ——》 QuerySet 对象列表
-
models.Publisher.objects.get() # 获取满足条件的一个对象 ——》 单独的对象
-
models.Publisher.objects.filter() # 获取满足条件的所有对象 ——》对象列表
-
models.Publisher.objects.all().order_by('id') # 排序 —— 》 对象列表
-
pub_obj.pk ——》 主键
-
pub_obj.name
-
外键
-
book_obj.publisher ——》 关联的对象
-
book_obj.publisher_id ——》从book表中获取关联对象的ID
-
book_obj.publisher.name ——》 关联的对象的属性
-
-
多对多
-
author_obj.books ——》 管理对象
-
author_obj.books.all() ——》 关联的所有的对象 对象列表
-
book_obj.author_set ——》管理对象、
-
-
-
增加
-
models.Publisher.objects.create(name='xxx') ——》 对象
-
外键
-
models.Book.objects.create(title='xxx',publisher=pub_obj)
-
models.Book.objects.create(title='xxx',publisher_id=pub_obj.id)
-
-
多对多
-
models.Author.objects.create(name='xxxx') ——》 author_obj
-
author_obj.books.set([多个要关联对象的id,])
-
author_obj.books.set([多个要关联对象,])
-
-
-
删除
-
models.Author.objects.get(id=1).delete()
-
models.Author.objects.filter(id=1).delete()
-
-
修改
-
pub_obj.name = 'new_xxxx'
-
pub_obj.save()
-
外键
-
book_obj.title = 'xxxx'
-
book_obj.publisher = pub_obj 或者 book_obj.publisher_id = pub_obj .id
-
book_obj.save()
-
-
多对多
-
author_obj.name = 'new_name'
-
author_obj.save()
-
author_obj.books.set([多个要关联对象,]) author_obj.books.set([多个要关联对象的id,])
-
-
6.request
-
request.method ——》 请求方式 8 种 GET/POST
-
request.GET ——》 url上的参数 xxxx/?id=1&name=aelex {} [] request.GET.get('id')
-
request.POST ——》 form表单提交的POST的数据 {} [] request.POST.get()
7.函数的返回值
-
HttpResponse('字符串') ——》 返回字符串
-
render(request,'模板的文件名',{k1:v1}) ——》返回一个完整的页面
-
redirect(''跳转的地址'') ——》 重定向 响应头 Location : '跳转的地址'
1.MVC和MTV
-
MVC
-
C Controller : 逻辑的控制
-
M Model : 存取数据
-
V View : 信息的展示
-
MTV
-
M : model ORM操作
-
T: Template 模板
-
V: View 业务逻辑
-
2.变量
{{ 变量 }} 使用.来获相关属性和方法
3.过滤器
语法: {{ value|filter_name:参数 }} # 参数最多只有一个
-
内置过滤器
-
default 提供默认值
{{ kong|default:'nothing' }}
-
date 日期格式化
{{ now|date:'Y-m-d H:i:s' }}
settings中可配置全局的日期时间格式化
USE_L10N = False
DATETIME_FORMAT = 'Y-m-d H:i:s' -
safe 不进行转义
{{ js|safe }} # 告诉Django 前面的内容是安全的,不必转义
-
-
自定义filter
-
定义
-
在APP下创建一个叫templatetags的python包; 不能变的,必须是包,名字必须是templatetags
-
在包中创建一个py文件 my_filters;
-
在py文件中写代码
from django import template
register = template.Library() # register的名字不能改-
写函数
-
给定义的函数加装饰器
-
-
使用
在模板中使用:
-
导入定义的文件
{% load my_filter %}-
使用过滤器
{{ name|add_dsb:'very_dsb' }} -
-
4.标签
{% csrf_token %}
添加在form表单中 就可以提交POST请求
5.母版和继承
-
母版
就是一个普通的HTML文本,将多个页面公共部分的内容提取出来,在页面中定义多个block块
{% block content %}
{% endblock %}-
继承
在子页面中,继承母版 {% extends 'base.html' %}
可以重新书写block块中内容
-
注意事项
-
{% extends 'base.html' %} 写在第一行,上面不写内容 -
要修改的 内容写在block块中,写在外面不显示
-
{% extends 'base.html' %} base.html 记得带上引号,不然当做变量去查找
-
定义多个block块,一般要定义上 css和js
-
6.组件
把多个页面公用的HTML代码放在一个HTML文件中 —— 》组件 nav.html
使用: {% include ‘nav.html’ %}
7.静态文件相关
{% load static %}
{% static '静态文件相对路径' %} ——》 获取到别名,跟后面的参数进行拼接
{% get_static_prefix %} ——》 获取到别名
<link rel="stylesheet" href="{% get_static_prefix %}plugins/bootstrap-3.3.7/css/bootstrap.css">
8.自定义inclusion_tag
自定义inclusion_tag 返回HTML代码段 pagenation.html组件文件中写 <nav aria-label='Page navigation'> <ul class='pagination'> {% for foo in num%} {% if current==foo %} <li class='active'><a href='#'>{{ foo }}</a></li> {% else %} <li> <a href='#'>{{ foo }}</a></li> {% endif %} {% endfor%} </ul> </nav> 在templatetags包中的my_filters文件中写 @register.inclusion_tag('pagenation.html') def pagenation(num,current): return{'num':range(1,num+1),'current':current} 在应用的HTML文件中 {% load my_tags %} {% pagenation 5 1 %}