连接mysql
我的python版本为3.6
pip3 install pymysql
切换到manage.py的同级目录
创建一个应用
startapp(应用)project(工程)
一个工程中可以包含多个应用 应用主要是模型 处理于数据库的模型对象
django-admin.py startapp TestModel
执行结束后会生成一个TestModel包
然后配置环境 在 主包中的setting.py中配置
# 数据库相关配置
DATABASES = {
'default':
{
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'pydjango', # 数据库名称
'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
'PORT': 3306, # 端口
'USER': 'root', # 数据库用户名
'PASSWORD': '****', # 数据库密码
}
}
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'TestModel' # 新增内容
]
配置好之后需要在主包的__init__.py中添加
import pymysql
pymysal.install_as_MySQLdb()
启动项目
python manage.py runserver 0:8000
# 启动到127.0.0.1:8000
如果在访问这地址时被拒绝
在setting.py中有一个允许访问域名的配置.
ALLOWED_HOSTS = ['127.0.0.1','*']
如果使用 python manage.py runserver 127.0.0.1:8000
就不用配置了
项目在启动中途可能会报错
说什么版本不对应的相关信息
这是因为mysqlclient只支持到python3.4
解决方法(没有问题就不用管了)
找到报错的文件 ********/pymysql/base.py
应该在36行 把下面内容注释掉
if version < (1, 3, 13):
raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
如果不是上述的问题
建议把和mysql的相关环境删除 使用pip3 install ****
重新安装
使用pip list
查看安装过的环境
创建实体对象用来操作数据库
刚刚 创建的TestModel目录结构
TestModel
-- __init__.py
-- admin.py
-- apps.py # 这个里面存放的是这个模块的名称 上面配置的TestModel 其实就是这个name
-- models.py # 实列放到这里面
-- tests.py
-- views.py
# 其余的 还没有用过
models.py
from django.db import models # 引入实体原型
# Test 就是表名 name 是字段名
class Test(models.Model):
name = models.CharField(max_length=20) # 相当于varchar类型 最大长度为20
写好之后 就是迁移数据库
在命令行中执行
python manage.py migrate # 会将好几个默认的表放到你之前setting.py中配置的数据中
python manage.py makemigrations TestModel # 检测你是否有修改Test中的实体
在执行上述操作时django会自动创建一些文件有兴趣可以点进去看看 但不建议修改
python manage.py migrate # 将实体对象在数据库中创建成表
这是我第二次执行创建的内容
from django.db import models
# Create your models here.
class Test(models.Model):
name1 = models.CharField(max_length=20)
name = models.CharField(max_length=20)
class Test1(models.Model):
name1 = models.CharField(max_length=20)
name = models.CharField(max_length=20)
E:\django\HelloWorld>python manage.py migrate TestModel
Operations to perform:
Apply all migrations: TestModel
Running migrations:
Applying TestModel.0003_test1... OK
到现在在数据库中创建表就完成了
操作数据库
增删改查
为了方便操作当前这个实体对象创建的表
在主包中创建一个testdb.py(名字随便起合适就好)
testdb.py
执行这些方法的话可以放到 urls中直接调用这个方法
也可以引入到模板中在调用模板时获取数据然后渲染到页面中
from TestModel import Test # 引入在setting.py中配置过的实体表
from django.shortcuts import HttpResponse
#
def test(request):
# 查
# objects是这个实体的模型管理器
list = Test.objects.all() # 查询所有
test1 = Test.objects.filter(id=1) # 类似于where 查询符合条件的所有数据
test1 = Test.objects.get(id=1) # 查询符合条件的第一条数据
test1 = Test.objects.all()[0:6] # 类似于limit(0,6) 分页查询
test1 = Test.objects.all().order_by('id') # 通过id进行升序排序
test1 = Test.objects.all().order_by('-id') # 降序
# 读取获取的内容 注意all和filter获取的是一个类似dict集合的数据 get获取只有一个类似dict的对象 所以在get中获取的内容时就不用迭代了
for x in list:
print(x.name)
# 增
test1 = Test(name="123",name1="123456")
test1.save() # 把当前操作同步到数据库
# 删 关键字(delete)
Test.objects.all().delete()
Test.objects.filter(id=1).delete()
Test.objects.get(id=1).delete()
# 修改 关键字(update)
test1 = Test.objects.get(id=1)
test1.name = "修改"
test1.save()
Test.objects.filter(id=1).update(name="修改")
Test.objects.get(id=1).update(name="修改")
路由
路由就是通过url去访问服务器然后dns服务器解析然后去访问对应的ip地址
假如我直接输入ip就不用解析了
url去访问服务器中设置好的路由
主路由 主包/urls.py
from django.conf.urls import url
from django.urls import include,path,re_path
from . import view,testdb
# url 和 path 的区别:可能是本版遗留了个url把 咋也不知道
# django.conf.urls 和 django.urls 还是有点相似的
# path:用于普通路径,不需要自己手动添加正则首位限制符号,底层已经添加。
# re_path:用于正则路径,需要自己手动添加正则首位限制符号。
# include 是用来拓展路由的,可以将我添加的应用和模块中的urls.py引入进来
urlpatterns = [
path('route1/',view.render1,name='rola'),
# 具体怎么通过redirect传递参数一会再说
path('route2/',view.redirect1), # 输入 *****/route2/ 会知道调整到*****/route1/
re_path('^route3/([0-9]{3})/$',view.render2), # 输入 route3/666或者route3/999 都可以匹配
re_path('^route4/([0-9]{3})/([0-9]{3})/$',view.render3), # 输入 route3/666/999
url('app/',include('TestModel.urls')) # app/home 去访问 TestModel中的urls的home路由
# 正则路径中的有名分组 格式?P<分组名>
re_path('^route5/(?P<two>[0-9]{3})/(?<one>[0-9]{3})/$',view.render3), # route5/666/999
# 假如我在TestModel目录下创建了 urls.py 以下是内容
# from django.urls import path
# from . import views
# urlpatterns = [
# path('home',views.home)
# ]
# def home(request):
# return HttpResponse("1234665")
]
# 这里放view.py中的内容
from django.shortcuts import render,redirect,reverse,HttpResponse
# render 就是用来调用模板把数据显示进去
# redirect 重定向
# reverse 和redirect一起使用 用来解析 路由的别名,还可以给传参数
# HttpResponse 可以把括号中的内容直接渲染到页面中
def render1(request):
return render(request,'某一个模板的名字.html',{要给传输的数据})
def render2(request,arg):
print(arg) # 这里获取那个666或者999
return render(request,'某一个模板的名字.html',{要给传输的数据})
def render3(request,arg):
print(arg) # 这里获取那个666或者999
return render(request,'某一个模板的名字.html',{要给传输的数据})
def render4(request,arg,arg1):
# 假如输入的是route4/666/999
print(arg,arg1) # 666,999
return render(request,'某一个模板的名字.html',{要给传输的数据})
def render5(request,one,two):
# 假如输入的是route4/666/999
print(one,two) # 999,666 如果使用有名分组的话参数名必须对应起来,值会传给对应的参数
return render(request,'某一个模板的名字.html',{要给传输的数据})
def redirect1(request):
return redirect(reverse('rola'))
重定向传值
import django.shortcuts from render,redirect,reverse
def redirect1(request):
# 拼接到url中
return redirect(reverse('某一个路由')+"?url1=123123&a=13246")
def redirect2(request):
# 通过args传值
# 假如重定向的路由为 ^route3/([0-9]{3})/([0-9]{4})/$
# 然后接收的话 def render1(request,a,b):print(a,b)
return redirect(reverse('某一个路由',args=(100,1000,)))
def redirect3(request):
# 通过args传值
# 假如重定向的路由为 ^route3/(?P<one>[0-9]{3})/(?P<two>[0-9]{4})/$
# 然后接收的话 def render1(request,one,two):print(one,two)
return redirect(reverse('某一个路由',kwargs={'one':111,'two':222}))
# 假如我现在要跳转到我include 分发的路由中去
# 这是现在的路由
# include(('app名称.分发路由地址','应用名称')
url('myinclude',include(('TestModel.urls','TestModel')))
# 重定向
# redirect(reverse('应用:路由别名'))
redirect(reverse('TestModel:home'))
# TestModel.urls中内容
from django.urls import path
from . import views
urlpatterns = [
path('home',views.home,name="home")
]
注意:args和kwargs 不可以混合使用 有名和无名分组无法一起使用
url args kwargs 在模板中使用
re_path('路由名称/(?P<aaa>[0-9]{3})/(?P<bbb>[0-9]{3})/$)')
<form action="{% url '路由名称' aaa=111 bbb=111 %}" method='post'>
re_path('路由名称/([0-9]{3})/([0-9]{3})/$)')
<form action="{% url '路由名称' 111 222 %}" method='post'>