学习心得
- 建立MySQL数据库
create database bj18 charset=uft8;
use bj18;
2.创建项目
workon py3
django-admin startproject test2
3.创建应用
python manage.py startapp booktest
4.注册应用,修改语言时区
# LANGUAGE_CODE = ‘en-us’
LANGUAGE_CODE = ‘zh-hans’
中文
#TIME_ZONE = ‘UTC’
#中国时区
TIME_ZONE = ‘Asia/Shanghai’
INSTALLED_APPS = [
‘booktest’,
]
5.修改使用数据库类型
DATABASES = {
‘default’: {
#‘ENGINE’: ‘django.db.backends.sqlite3’, #注释掉这一行
加上下面内容
‘ENGINE’: ‘django.db.backends.mysql’,
#‘NAME’: os.path.join(BASE_DIR, ‘db.sqlite3’)
‘NAME’:‘bj18’, #数据库必须手动创建
‘USER’:‘root’,
‘PASSWORD’:‘123’,
‘HOST’:‘localhost’,
‘PORT’:3306,
}
}
-
启动服务器
python manage.py runserver
发现 ‘no module named MYSQLdb’ -
安装pymysql
pip list 发现没有
pip install pymysql -
在__init__.py中 加上
import pymysql
pymysql.install_as_MySQLdb()
9.启动python manage.py runserver服务器的时候又发现问题
由于 mysqlclient 目前不支持高版本python,出现这个错误之后可以根据错误提示找到文件位置,打开 base.py 文件,找到以下代码:
version = Database.version_info
if version < (1, 3, 13):
raise ImproperlyConfigured(‘mysqlclient 1.3.13 or newer is required; you have %s.’ % Database.version)
将 if 语句注释掉之后在执行命令就不会再报错
version = Database.version_info
if version < (1, 3, 13):
raise ImproperlyConfigured(‘mysqlclient 1.3.13 or newer is required; you have %s.’ % Database.version)
找了半天都找不到base.py 在哪里,最后才发现报错的地方有路径,顺着路径就能找到
之后还有一个问题:
AttributeError: ‘str’ object has no attribute ‘decode’
/home/mm/.virtualenvs/py3/lib/python3.6/site-packages/django/db/backends/mysql/operations.py
line 146, 把decode 改成encode
10.在model.py里建立模型类
from django.db import models
class BookInfo(models.Model):
btitle = models.CharField(max_length=20)
bpub_date = models.DateField()
# 阅读量
bread = models.IntegerField(default=0)
bcomment = models.IntegerField(default=0)
# 删除标记.软删除标记
isDelete = models.BooleanField(default=False)
class HeroInfo(models.Model):
hname = models.CharField(max_length=20)
hgender = models.BooleanField(default=False)
hcomment = models.CharField(max_length=200)
# 关系属性
hbook = models.ForeignKey(to=BookInfo, on_delete=models.CASCADE)
# 删除标记.软删除标记
isDelete = models.BooleanField(default=False)
在这里hbook = models.ForeignKey(to=BookInfo, on_delete=models.CASCADE)要写成这样
都是2.0版本的坑
之前写过一些提醒自己的记录,都被网站吞了,真讨厌。。。失去的时候才发现备份是多么重要
-
生成迁移文件
python manage.py makemigrations -
根据迁移文件,生成表
python manage.py migrate -
去数据库添加数据
insert into booktest_bookinfo(btitle,bpub_date,bread,bcomment,isDelete) values
(‘射雕英雄传’,‘1980-5-1’,12,34,0),
(‘天龙八部’,‘1986-7-24’,36,40,0),
(‘笑傲江湖’,‘1995-12-24’,20,80,0),
(‘雪山飞狐’,‘1987-11-11’,58,24,0);
向booktest_heroinfo表中插入测试数据:
insert into booktest_heroinfo(hname,hgender,hbook_id,hcomment,isDelete) values
(‘郭靖’,1,1,‘降龙十八掌’,0),
(‘黄蓉’,0,1,‘打狗棍法’,0),
(‘黄药师’,1,1,‘弹指神通’,0),
(‘欧阳锋’,1,1,‘蛤蟆功’,0),
(‘梅超风’,0,1,‘九阴白骨爪’,0),
(‘乔峰’,1,2,‘降龙十八掌’,0),
(‘段誉’,1,2,‘六脉神剑’,0),
(‘虚竹’,1,2,‘天山六阳掌’,0),
(‘王语嫣’,0,2,‘神仙姐姐’,0),
(‘令狐冲’,1,3,‘独孤九剑’,0),
(‘任盈盈’,0,3,‘弹琴’,0),
(‘岳不群’,1,3,‘华山剑法’,0),
(‘东方不败’,0,3,‘葵花宝典’,0),
(‘胡斐’,1,4,‘胡家刀法’,0),
(‘苗若兰’,0,4,‘黄衣’,0),
(‘程灵素’,0,4,‘医术’,0),
(‘袁紫衣’,0,4,‘六合拳’,0);
- 定义视图
在view.py中添加
from django.shortcuts import render
from booktest.models import BookInfo
def index(request):
# 1. 查询出所有图书的信息
books = BookInfo.objects.all()
# 2. 使用模板
return render(request,‘booktest/index.html’,{‘books’:books})
- 建立模板和设置模板目录
在test2文件夹下建立template目录,之下再建立booktest目录。
在setting中注册模板路径
TEMPLATES = [
{
‘BACKEND’: ‘django.template.backends.django.DjangoTemplates’,
’DIRS’: [os.path.join(BASE_DIR,‘templates’)], # 这一句
‘APP_DIRS’: True,
‘OPTIONS’: {
‘context_processors’: [
‘django.template.context_processors.debug’,
‘django.template.context_processors.request’,
‘django.contrib.auth.context_processors.auth’,
‘django.contrib.messages.context_processors.messages’,
],
},
},
]
16.在template\booktest 下建立index.html
<!DOCTYPE html>
- {{ book.btitle }}
- 配置url
test2下的:
from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
urlpatterns = [
path(‘admin/’, admin.site.urls),
url(r’^’, include(‘booktest.urls’)),
]migration下的:
from django.urls import path
from booktest import views
from django.conf.urls import url
urlpatterns = [
url(r’^index$’, views.index),
]给自己的tip:注意import 新老版本不一样,查了好多资料才弄明白,真傻!
- 完善页面增加添加新数据
!DOCTYPE html>
图书信息 新增
{# /create 相当于http://127.0.0.1:8000/create#} {% for book in books %}- 配置url
- {{ book.btitle }} {% endfor %}
19.在urls.py中添加新页面
urlpatterns = [
url(r’^index ′ , v i e w s . i n d e x ) , u r l ( r ′ c r e a t e ', views.index), url(r'^create ′,views.index),url(r′create’, views.create)
]20.重定向
from django.shortcuts import render
from booktest.models import BookInfo
from datetime import date
from django.http import HttpResponse, HttpResponseRedirectdef index(request):
# 1. 查询出所有图书的信息
books = BookInfo.objects.all()
# 2. 使用模板
return render(request,‘booktest/index.html’,{‘books’:books})def create(request):
‘’‘新增一本图书’’’
# 1. 创建BookInfo()
b = BookInfo()
b.btitle = ‘流星蝴蝶剑’
b.bpub_date = date(1990,1,1)# 2.保存进数据库 b.save()# 3. 返回应答 让浏览器访问index #return HttpResponse('ok') ***return HttpResponseRedirect('/index')*** 让浏览器返回页面
- 添加删除
图书信息 新增
{# /create 相当于http://127.0.0.1:8000/create#} {% for book in books %}- {{ book.btitle }}---删除
- {% endfor %}
view.py:
def delete(request,bid):
‘’‘删除点击的图书’’’
# 1. 通过bid获取删除的对象
book = BookInfo.objects.get(id=bid)
book.delete()# 2.保存进数据库# 3. 返回应答 让浏览器访问index #return HttpResponse('ok') return HttpResponseRedirect('/index')
urls.py
urlpatterns = [
url(r’^index ′ , v i e w s . i n d e x ) , u r l ( r ′ c r e a t e ', views.index), url(r'^create ′,views.index),url(r′create’, views.create),
url(r’^delete(\d+)$’,views.delete),
]有一个坑是你删完了,再去添加id 就自动增加,不是从0开始了,过去老的数据里面hbook_id 就对应不上以前的位置了,需要修改。
-------------------------结束--------------------------------------------