MFCJCK 2019-12-19
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #文件夹根目录 DEBUG = True #因为启动出错调试模式 上线后改为Flase,出错不报错,给用户更好的用户体验 ALLOWED_HOSTS = ['*'] #让所有的用户可以访问 INSTALLED_APPS = [ #app注册 'app01', 'app01.apps.App01Config' # 推荐写法 ] MIDDLEWARE = [ # 'django.middleware.csrf.CsrfViewMiddleware', #提交POST请求注释一个中间件 ] """ 如果使用sqlite3数据库 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } """ """ #如果使用mysql数据库 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #diango的服务器引擎 'NAME': 'bookmanager', 'USER': 'root', 'PASSWORD': '123', 'HOST': '127.0.0.1', 'PORT': 3306, } } #默认使用pymysql模块 替换 import pymysql pymysql.install_as_MySQLdb() """ LANGUAGE_CODE = 'en-us' #汉语 'zh-hans' TIME_ZONE = 'UTC' #时区:英国的,改为亚洲上海 'Asia/Shanghai' STATIC_URL = '/static/' #静态文件夹的别名,配置静态文件要以/static/为开头 STATICFILES_DIRS = [ # 路由 os.path.join(BASE_DIR,'static1'), # 存放静态文件的路径 os.path.join(BASE_DIR,'static1'), ] # join(BASE_DIR必须是这个,静态文件夹static1) # 加上静态文件的存放路径
写映射关系操作数据库
settings 配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #使用mysql数据库引擎 'NAME': 'day43', #默认操作的库 'HOST': '127.0.0.1', #库所在的服务器地址 'PORT': 3306, #端口 'USER': 'root', #用户名 'PASSWORD': '123', #密登密码 } } #默认使用pymysql模块 替换 也可以写在day43的__init__.py里 import pymysql pymysql.install_as_MySQLdb()
用可视化工具创建一个MySQL数据库
class User(models.Model): username = models.CharField(max_length=32) # varchar(32) password = models.CharField(max_length=32) # varchar(32) #类 对象 属性 #表 数据行 字段 python manage.py makemigrations # 制作迁移文件 出现在migrations python manage.py migrate # 执行SQL语句 同步 #terminal里执行命令
△id字段是自动添加的,如果你想要指定自定义主键,只需在其中一个字段中指定 primary_key=True 即可。如果Django发现你已经明确地设置了Field.primary_key,它将不会添加自动ID列。
路径 函数转换
==settings配置:
STATICFILES_DIRS = [ # 路由 os.path.join(BASE_DIR,'static1'), # 存放静态文件的路径 os.path.join(BASE_DIR,'static2'), ]
url(r^‘用户输入输入的路径 0.0.0.0:80/index/‘,不加括号的函数名)
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', index), # 路径和函数的对应关系, url(r'^modal/', modal), ]
def index(request): # 函数里写处理逻辑,request拿到网络路径,固定写法 print(request.path_info) # 打印网络路
import 导入:
导入返回字符串的包HttpResponse,返回html文件的包render,返回执行另一个逻辑的包
from django.shortcuts import HttpResponse,render, redirect
导入dpp01文件中的创建数据表的类的models.py文件
from app01 import models
return 返回:
返回字符串
return HttpResponse('<h1>index</h1>') # 返回字符串
返回接受到请求的网络路径要渲染的html文件和要传的值
return render(request, 'index.html',{'k1':v1}) #返回 (网络路径必添,要渲染的html文件,{别名:要传的值})
执行另一个逻辑
写函数来实现增删该查
all_publishers = models.Publisher.objects.all() #变量 = 文件名.类名.对象.取值方法 # objects.all() 查询出所有的出版社的信息,是一个对象列表
第一个pk列名,第二个pk为从request中get到的
变量 = models.User.objects.filter(password='dsb') # 对象列表 # 用.first取第一个,若无,返回空列表,if 变量;判断时,不会报错,只是不会执行这个语句了 # 用[0]取值时,,若无,取不到值,if 判断时变量,会报错
变量 = models.User.objects.get(password='dsb') # 对象 特点 获取不到或者获取到多个都报错
利用类的对象
obj = models.Publisher.objects.create(name=pub_name)
模板
某.html的settings配置
MIDDLEWARE = [ # 'django.middleware.csrf.CsrfViewMiddleware', #提交POST请求注释一个中间件 ]
<head> <title>Title</title> <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.min.css"> <link rel="stylesheet" href="/static/plugins/font-awesome-4.7.0/css/font-awesome.min.css"> <script src="/static/js/jquery.js"></script> <script src="/static/plugins/bootstrap-3.3.7-dist/js/bootstrap.js"></script> </head>
△登录
<div class="container"> <form class="form-signin" method="post" action="" novalidate> <h2 class="form-signin-heading">Please sign in</h2> <label for="inputEmail" class="sr-only">用户名</label> <input type="text" id="inputEmail" class="form-control" name="username" placeholder="输入用户名" required="" autofocus=""> <label for="inputPassword" class="sr-only">密码</label> <input type="password" id="inputPassword" class="form-control" name="password" placeholder="输入密码" required=""> <div>{{ error }}</div> <div class="checkbox"> <label> <input type="checkbox" value="remember-me"> Remember me </label> </div> <button class="btn btn-lg btn-primary btn-block">登录</button> </form>
△查询所有的作者信息
all_authors = models.Author.objects.all() for author in all_authors: print(author) print(author.name) print(author.books,type(author.books)) # 关系管理对象 print(author.books.all(),type(author.books.all())) # 所关联的所有的对象
△for循环
views.py传过来的参数: render(request,'pub.html',{'all_publishers':all_publishers}) {{ all_publishers }} html的for循环: {% for i in all_publishers %} {{ forloop.counter }} {{ i }} {{ i.id }} {{ i.pk }} {{ i.name }} {% endfor %}
△if
{% if 条件 %} xxx {% else %} xxxxx {% endif %}
△form的注意点
△get 和 post
get : 获取一个页面
1.直接在浏览器的地址栏中输入地址 回车
2.form表单 不指定method
3.a标签
参数: ?k1=v1&k2=v2
获取参数: request.GET.get(‘k1‘)
post : 提交数据
form表单 method = 'post'
获取数据: request.POST.get(‘k1‘)