django基础
1. django中的所有命令
1. 下载django
命令行: pip install django==1.11.25 -i 源
2. 创建项目
命令行:django-admin startproject 项目名
3. 启动项目
命令行:
切换项目的根目录下 manage.py
python manage.py runserver # 127.0.0.1:8000 默认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
4. 创建应用app
python manage.py startapp 应用名
5. 执行数据库迁移命令
python manage.py makemigrations # 检测已经注册app下的models变更记录
python manage.py migrate # 将变更记录同步到数据库中
2. django的配置
1. 配置应用
注册APP 让Django程序可以识别新建的APP
INSTALLED_APPS = [
'app名称' # 第一种写法
"app名称.apps.app名称Config" # 推荐写法 例如:'app01.apps.App01Config',
]
2. 配置中间件
MIDDLEWARE 中间件 自定义中间件注册进来可以执行其中的方法
3. 模板
模板的相关配置 主要看DIRS 模板的存放路径
TEMPLATES中的 DIRS =[os.path.join(BASE_DIR ,'templates')]
4. 数据库配置
数据库相关配置 告诉Django连接什么数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 存储引擎
'NAME': "library03", # 接数据库名称
"USER":"root", # 数据库用户名
"PASSWORD":"123", # 数据库密码
"HOST":"127.0.0.1", # 主机ip 默认本机回环地址 127.0.0.1
"PORT":3306, # 端口号
}
}
5. 配置静态文件
静态文件的别名 模板中已别名开头
STATIC_URL = '/static/' # 静态文件别名
STATICFILES_DIRS = [
os.path.join(BASE_DIR,"statics")
]
3. django使用mysql的流程
1. cmd终端创建一个mysql数据库
create databases library;
2. 在settings中配置数据库的信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 存储引擎
'NAME': "library", # 接数据库名称
"USER":"root", # 数据库用户名
"PASSWORD":"123", # 数据库密码
"HOST":"127.0.0.1", # 主机ip 默认本机回环地址 127.0.0.1
"PORT":3306, # 端口号
}
}
3. 告诉使用pymysql替换mysqldb的模块
写在与settings同级目录下的__init__
中:
import pymysql
pymysql.install_as_MySQLdb()
4. 在已经注册的app下的models.py中写类(继承models.Model)
class User(models.Model):
title = models.CharField(max_length=32) # username varchar(32)
5. 执行数据库同步指令
python manage.py makemigrations # 检测已经注册app下的models变更记录
python manage.py migrate # 将变更记录同步到数据库中
4. get和post的区别
1 . 发送get请求
1. 地址栏输入地址 回车
2. a标签
3. form表单提交
?k1=v1&k2=v2 request.GET.get(key) # url携带的参数
get也可以提交数据,一般在路径后边添加127.0.0.1:8000/showbook/?id=2的一条数据 /sssss/?k1=v1&k2=v2
4. 不论是get还是post,只要是路径后有?k1=v1, get都能通过request.GET.get(k1)得到v1
get也可以提交数据,一般在路径后边添加127.0.0.1:8000/showbook/?id=2的一条数据 /sssss/?k1=v1&k2=v2
2. 发送post请求
1. action=''“ 向当前地址进行提交 method ='post'
2. 所有的input需要有name属性 有时携带原始数据要有value属性
3. 需要有button默认type="submit"或者一个type=‘submit’的input框
5. 模板语法
{{ 变量 }}
for循环
{% for i in 变量 %}
循环体 {{ i }}
{% endfor %}
if 条件语句
{% if 条件 %}
满足条件显示的值
{% elif 条件1 %}
满足条件显示的值
{% else %}
不满足条件显示的值
{% endif %}
6. input标签里的name属性和value属性
name属性用于后端获取当前输入的值 name="username"
request.POST.get("username")
value属性用于前端编辑等的时候显示初始值
如在input标签中添加 value="{{ pub_obj.name }} 属性值
7. orm操作数据库
1. 对象关系映射
2. orm一些查询方法
<1> all(): models.类名.objects.all() 查询所有结果,结果是queryset类型对象
<2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象,结果也是queryset类型 models.Book.objects.filter(title='linux',price=100) #里面的多个条件用逗号分开,并且这几个条件必须都成立,是and的关系,or关系的我们后面再学,直接在这里写是搞不定or的
<3> get(**kwargs): 返回与所给筛选条件相匹配的对象,不是queryset类型,是行记录对象,返回结果有且只有一个,
如果符合筛选条件的对象超过一个或者没有都会抛出错误。捕获异常try。 Book.objects.get(id=1)
<4> exclude(**kwargs): 排除的意思,它包含了与所给筛选条件不匹配的对象,没有不等于的操作昂,用这个exclude,返回值是queryset类型 Book.objects.exclude(id=6),返回id不等于6的所有的对象,或者在queryset基础上调用,Book.objects.all().exclude(id=6)
<5> order_by(*field): queryset类型的数据来调用,对查询结果排序,默认是按照id来升序排列的,返回值还是queryset类型
models.Book.objects.all().order_by('price','id') #直接写price,默认是按照price升序排列,按照字段降序排列,就写个负号就行了order_by('-price'),order_by('price','id')是多条件排序,按照price进行升序,price相同的数据,按照id进行升序
<6> reverse(): queryset类型的数据来调用,对查询结果反向排序,返回值还是queryset类型
<7> count(): queryset类型的数据来调用,返回数据库中匹配查询(QuerySet)的对象数量。
<8> first(): queryset类型的数据来调用,返回第一条记录 Book.objects.all()[0] = Book.objects.all().first(),得到的都是model对象,不是queryset
<9> last(): queryset类型的数据来调用,返回最后一条记录
<10> exists(): queryset类型的数据来调用,如果QuerySet包含数据,就返回True,否则返回False
空的queryset类型数据也有布尔值True和False,但是一般不用它来判断数据库里面是不是有数据,如果有大量的数据,你用它来判断,那么就需要查询出所有的数据,效率太差了,用count或者exits
例:all_books = models.Book.objects.all().exists() #翻译成的sql是SELECT (1) AS `a` FROM `app01_book` LIMIT 1,就是通过limit 1,取一条来看看是不是有数据
<11> values(*field): 用的比较多,queryset类型的数据来调用,返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
model的实例化对象,而是一个可迭代的字典序列,只要是返回的queryset类型,就可以继续链式调用queryset类型的其他的查找方法,其他方法也是一样的。
<12> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
<13> distinct(): values和values_list得到的queryset类型的数据来调用,从返回结果中剔除重复纪录
8. 视图函数的返回方法
from django.shortcuts import render,redirect,HttpResponse
from django.http import JsonResponse
return HttpResponse() 返回的字符串
return render(request,'模板的文件名') 返回HTML页面
return redirect('地址') 重定向
return JsonResponse() 一般返回字典,其他加上属性safe=True
展示
1. 设计URL地址
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^publisher_list/', views.publisher_list),
]
2. 写函数
def publisher_list(request):
# 从数据库中获取所有的出版社的信息
all_publisher = models.Publisher.objects.all() # 对象列表
# 将数据展示到页面中
return render(request,'publisher_list.html',{'k1':all_publisher})
新增
方式一:
models.Publisher.objects.create(name=pub_name,addr=pub_addr) # 对象
方式二:
pub_obj = models.Publisher(name=pub_name,addr=pub_addr) # 内存中的对象 和数据库没关系
pub_obj.save() # 插入到数据库中
删除
models.Publisher.objects.filter(pid=pid).delete() # 对象列表 删除
models.Publisher.objects.get(pid=pid).delete() # 对象 删除
编辑
pub_obj.name = pub_name
pub_obj.addr = pub_addr
pub_obj.save() # 将修改提交的数据库