django创建模型、路由、重定向(二)

在这里插入图片描述

连接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'>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值