django基础 1. django中的所有命令 2. django的配置 3. django使用mysql的流程 4. get和post的区别 5. 模板语法 6. input标签里的name属性和value属性 7. orm操作数据库 8. 视图函数的返回方法

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. 对象关系映射

django基础
1. django中的所有命令
2. django的配置
3. django使用mysql的流程
4. get和post的区别
5. 模板语法
6. input标签里的name属性和value属性
7. orm操作数据库
8. 视图函数的返回方法

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()  # 将修改提交的数据库