url别名和反向解析
写法:url(r'^login/v2/', views.login,name='xx'),
视图中反向解析:
from django.urls import reverse
def login(request):
print(reverse('xx')) #/login/v2/
if request.method == 'GET':
return render(request,'login.html')
else:
uname = request.POST.get('uname')
pwd = request.POST.get('pwd')
if uname == 'chao' and pwd == '123':
return HttpResponse('ok')
else:
return redirect(reverse('xx')) #使用反向解析
html模板渲染时反向解析的语法{% url 别名 %}
<form action="{% url 'xx' %}" method="post">
{% csrf_token %}
用户名:<input type="text" name="uname">
密码:<input type="text" name="pwd">
<input type="submit">
</form>
include路由分发
1 项目文件夹下的urls.py文件中写上以下内容
from django.conf.urls import url,include
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/', include('app01.urls',namespace='app01')), #
url(r'^app02/', include('app02.urls',namespace='app02')),
#http://127.0.0.1:8000/index/
]
2 在各个app应用文件夹下面创建urls.py文件
在urls.py文件中写自己应用的各个路径,比如app01 和 app02
app01:
from django.conf.urls import url, include
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^index/', views.index,name='index'),
]
app02:
from django.conf.urls import url, include
from django.contrib import admin
from app02 import views
urlpatterns = [
url(r'^index/', views.index,name='index'),
]
url命名空间
写法:url(r'^app01/', include('app01.urls',namespace='app01')),
将每个应用自己的url路径划分一个空间,将来通过别名反向解析时,通过空间名称可以找到对应应用下面的路径
使用:
views.py文件中写法
from django.urls import reverse
def index(request):
print('app01反向解析:', reverse('app01:index'))
# app01反向解析: /app02/index/
return HttpResponse('app01-index')
html中写法:
{% url 'app01:login' %}
数据库操作
orm
object relational mapping 对象关系映射
使用:
第一步: 在应用文件夹下面的models.py文件中写对应的类,看下面的示例:
class UserInfo(models.Model):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=10)
password = models.CharField(max_length=32)
第二步:做数据库配置,settings.py文件中写上以下配置
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
# }
连接mysql的配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'orm01',
'HOST':'127.0.0.1',
'PORT':3306,
'USER':'root',
'PASSWORD':'123'
}
}
第三步: 在项目文件夹下的的init文件中写上以下内容,来指定pymysql作为连接客户端
import pymysql
pymysql.install_as_MySQLdb()
第四步: 执行数据库同步指令,在终端中执行
python3.6 manage.py makemigrations #在migrations文件夹下面生成记录文件
python3.6 manage.py migrate #执行记录文件
表就创建好了,我们的表名就是: 应用名_类名小写
表中数据的增删改查
创建:
方式一:
obj=models.book_list(
book_name='潘金莲后传'
publisher='河南出版社'
)
obj.save()
方式二:
models.book_list.object.create(
book_name='潘金莲后传'
publisher='河南出版社' )
修改
方式一:
models.book_list.object.filter(id=1).update(
book_name='潘金莲后传2'
publisher='河南出版社1'
)
方式二:
obj=models.book_list.objects.filter(id=1)[0]
obj.book_name='潘金莲后传2'
obj. publisher='河南出版社1'
obj.save()
批量创建:
list_obj = []
for i in range(10):
obj = models.book(
book_name = 'xx%s'%i,
publisger = '北京%s'%i)
models.book.objects.bulk_create(list_obj)
update_or_create 有就更新,没有就创建
a,b = models.book.objects.update_or_create(
obj.book_name='潘金莲后传2'
obj. publisher='河南出版社1'
)
print(a) # 当前更新后的model对象,或者是你新增的记录的model对象
print(b) # 新增就是True,查询就False
删除
简单查询:
ret=models.book.objects.filter(id=1)
就是查询到id为1 的数据 得到一个对象列表
obj=ret[0]
就是得到一个列表
得到列表里的属性就可以使用万能的点
例如:
obj.name
obj.price
查询方法:13个方法,必知必会
.all() jiushi 得到所有的数据
#filter和get
# ret = models.UserInfo.objects.get(age=18)
# ret = models.UserInfo.objects.filter(age=180)
# get两个报错,但是get请求返回的结果就是那个model对象
# 1 UserInfo matching query does not exist. 啥也没查到
# 2 get() returned more than one UserInfo -- it returned 11! 结果多了,不行!
# fitler不会报错 返回结果是一个queryset类型的集合,里面是一个一个的model对象
注意:
.filter() 就是根据条件进行筛选 从而获得数据
.exclude() 就是排除满足条件的数据 从而得到剩下的数据 可以和.all().exclude()
.filter.exclude() 使用
.order_by('属性') models.Book.objects.all().order_by('price')根据属性的升序排列
如果想降序就在属性的前面添加一个'-'号 比如:'-price'
.count() 统计数据库中对象的数量 ret = models.book.objects.all().count()
.exists() 检验该数据是否在数据库中
.valuse() 调用指定的属性值 models.book.objects.values('price','name')
.values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
<13> distinct(): values和values_list得到的queryset类型的数据来调用,从返回结果中剔除重复纪录
ret = models.UserInfo.objects.all().values('age','username').distinct() ret = models.UserInfo.objects.values('age','username').distinct()
创建时,日期字段数据的添加方式
models.Book.objects.create(
# publish_date = "2019-08-01", 字符串
# publish_date = datetime.datetime.now(), 时间日期数据
)