在之前我们介绍了如何建立虚拟环境以及创建django环境
那么创建的工程中那些文件具体代表什么呢,分别怎么用的呢
在工程项目中:
分为init,setttings,urls,wsgi四大类
init
表示的是初始话给的环境一般用到的就是数据库
import pymysql
pymysql.install._as_MYSQLdb()
setting
在这里面都是修改的一些参数常用的就是
添加自己创建的app名字
INSTALLED_APPS中
创建数据库连接
DATABASES 中修改参数上篇我们教过
返回设计页面
在TEMPLATES中添加DIRS里的[os.path.join(BASE_DIR,’创建html的文件夹名字’)]
同时要注释MIDDLEWARE里的csrf参数
传入图片参数
在最下面添加参数
STATICFILES = [
os.path.join(BASE_DIR,’static’)
]
urls
表示用户输入的地址对应显示的样式通常需要绑定设定的app里面的urls使用
include(‘app.urls’)
需要说明的是创建的app中没有urls需要自己创建一个然后往里面写入urls
如果想返回404 500等界面需要修改settings:
DEBUG = False
ALLOWED_HOSTS = [‘*’]
工程目录urls:
from app的名字.views import page_not_found,server_error(函数名)
handler404 = page_not_found
handler500 = server_error
#以下内容在app的viwes中写入 因此上面要导入views
def page_not_found(request):
return render(request, '404.html')#自己设置的页面 名字也是自己设定的
def server_error(request):
return render(request, '500.html')#自己设置的页面
app项目中
admin
配置超级管理员
创建管理超级管理员帐号和密码
cmd模式下
python manage.py createsuperuser
在文件中创建如何添加 数据库的方式
from django.contrib import admin
# Register your models here.
from stu.models import Student
# 第二种注册方式
@admin.register(Student)
class StudentAdmin(admin.ModelAdmin):
def set_sex(self):
if self.sex:
return self.sex
else:
return '女'
# 修改性别描述
set_sex.short_description = '性别'
list_display = ['id', 'name', set_sex]
# 过滤
list_filter = ['name']
# 搜索
search_fields = ['name']
# 分页
list_per_page = 2 # 一页只能放两条数据
# 1.注册的第一种方式:
# admin.site.register(Student, StudentAdmin)
models 创建数据库
就是创建数据库中的表格用法和mysql不太一样但是原理是一样的因为ORM简化了步骤
模型字段models.py中:
CharField():字符串
BooleanField():布尔类型返回的是0,1
DataField:年月日,存放日期其中auto_now = True每次修改都记录时间auto_now_add = True表示只有第一次创建的时候才会设置时间
DateTimeField:年月日时分秒
下拉列表AutoField:自动增长
DecimalField():decimal_places =小数后多少位/ max_digits =总位数例如
decimal_places = 1,max_digits = 3表示总为数3位小数1位类似似99.9
TestField:存储很长的信息
IntegerField:存整数
FloatField:存小数
FileField字段:文件上传
ImageField():上传图片upload_to =''指定上传图片的路径
模型字段中的参数
默认=默认字段
null:设置是否为空,针对数据库字段
blank:设置是否为空,针对表单提交字段----一般两个一起写
独特=真表示唯一,不能有一样的数据
主键= True设置主键
其中最主要的部分为引入外键同时有以下概念:
引入的键有一对一,一对多,多对多:
1.一对一表示一个参数只能对应一个键,不能有重复的:例如一个QQ群只有一个群主,人和群主就是一对一的关系
2.一对多表示一个键可以被多次运用,可以重复:例如学生对应的班级 某某学生是一班、某某是二班、某某是一班
3.多对多表示键可以多个匹配参数,参数也可以多次用键值:例如商品可以被多个人选中,人也可以选择多个商品
因此在设置modles时候参数分别有:
一对一
models.OneToOneField(对应的表格)
一对多
models.ForeignKey(表格名字)
多对多
models.ManyToManyField(表格名字)
然后在在数据库中去匹配对应的关系
下列是例子创建
from django.db import models
class Student(models.Model):
stu_name = models.CharField(max_length=6)
stu_sex = models.BooleanField()
stu_birth = models.DateField()
stu_chrete_time = models.DateField(auto_now_add=True)
stu_operate_time = models.DateField(auto_now=True)
stu_tel = models.CharField(max_length=11)
stu_delete = models.BooleanField(default=0)
yuwen = models.DecimalField(max_digits=3,default=0,decimal_places=2)
shuxue = models.DecimalField(max_digits=3,default=0,decimal_places=2)
class Meta:# 这里表示创建的表格的名字
db_table = 'stu'
views 返回函数以及返回的视角
下面的实例表示提交到数据库写法的
from django.db.models import F, Q
from django.http import HttpResponse
from django.shortcuts import render
from stu.models import Student
def hello(request):
#添加学生信息
if request.method == 'GET':
return render(request,'index.html')
# 处理提交的信息
if request.method == 'POST':
stu_name = request.POST.get('name')
# if request.POST.get('sex') == '男':
# stu_sex = 1
# else:
# stu_sex = 0
stu_sex = request.POST.get('sex')
stu_birth = request.POST.get('birth')
stu_tel = request.POST.get('tel')
# 方法一:
# stu = Student()
# stu.stu_name = stu_name
# stu.stu_birth = stu_birth
# stu.stu_sex = stu_sex
# stu.stu_tel = stu_tel
# stu.save()
# 方法二:
Student.objects.create(
stu_name=stu_name,
stu_sex=stu_sex,
stu_tel=stu_tel,
stu_birth=stu_birth
)
return HttpResponse('添加成功')
查询的基本表示方式首先
modles里设置的表格class的名字.objects.参数
get():返回一个满足条件的对象。如果没有返回符合条件的对象,会应该模型类DoesNotExist异常,如果找到多个,会引发模型类MultiObjectsReturned异常
这里说的一个表示后面在写对应的html就需不需要用for循环
first():返回查询集中的第一个对象,迭代[0]或者first()表示切片返回一个
last():返回查询集中的最后一个对象
count():返回当前查询集中的对象个数
exists():判断查询集中是否有数据,如果有数据返回True,没有返回False
order_by(‘-id’) 排序
__startswith 以什么开始
__endswith 以什么结尾
__contains 包涵
__ge 大于
__gte 大于等于
__lt 小于
__lte 小于等于
查询表格时候如果设置的表里是写的外键可以直接.键名字
s = StudentInfo.objects.filter(stu_addr__contains=’大悦城’)[0]
st = s.stu # sut表示models中的 返回的是单独数组不能用for循环看
通过学生表去查找拓展表信息(用小写_set 表示两个表连接起来 类似join)
# 查找姓名为xx的信息
stu = Student.objects.filter(stu_name='孙权').first()
st = StudentInfo.objects.filter(stu_id=stu.id)
# 方法二
# stu = Student.objects.filter(stu_name='孙权').first()
# 注意:studentinfo 小写
# st = stu.studentinfo_set.all()
# st = stu.stu_info #如果有related_name只能用这个方法
def selectStu(request):
#查询数据
s = Student.objects.all()
#查询某一项的数据 filter
stus = Student.objects.filter(stu_sex=0)
# 查询顺序
ss = Student.objects.all().order_by('-id')
#查询id最大的值
ssu = Student.objects.all().order_by('-id').first()
print(ssu)
# 获取个数
ss = Student.objects.all().filter(stu_sex=1).count()
# 查询80后所有女生(查询多个数据)
ss = Student.objects.all().filter(stu_sex=0,stu_birth__gte='1980-01-01',stu_birth__lt='1990-01-01')
#查询姓c的(查询以什么开头)/(以什么结尾)——like %
ss = Student.objects.filter(stu_name__startswith='c',stu_name__endswith='d')
#查询名字包涵(查询数据中有的数据)
ss = Student.objects.filter(stu_name__contains='c')
#判断是否存在 ——返回布尔值
ss = Student.objects.filter(stu_name='cc').exists()
print(ss)
#获取制定多个值
ids = [1,4]
ss = Student.objects.filter(id__in=ids)
# 查询yuwen大于shuxue超多10分的
s = Student.objects.filter(yuwen__gte=F('shuxue') + 10)
# 查询不叫cc名字,或者yuwen大于80的
s = Student.objects.filter(~Q(stu_name='cc') | Q(yuwen__gt=80))
#返回给前端(返回的是页面)
return render(request,'sel_stu.html',{'st':s})
其中请求函数
post 提交数据
get 提交数据在url上
put 更新全部数据
patch 更新局部数据
delete 删除
例如
ss = Student.objects.filter(id__in=ids).delete()
建立返回的网页
return render()
如果是需要传参那么也需要加reverse
return render(reverse,‘xxx.html’,{‘xx’:xx})
HttpRsponse表示返回的字符
return HttpResponse(‘heihei’)
返回重定向页面
HttpResponseRedirect
在views中使用return HttpResponseRedirect方式跳转页面,也就是执行完后可以跳转回之前或者别的页面
如果是传参或者是写参数名需要写reverse,如果只是传入地址不需要写reverse
return HttpResponseRedirect(
reverse(‘namespace:name’, kwargs={‘c(参数名)’: a(值——变量名)})
)
return HttpResponseRedirect(‘/uau/lo/(url地址)’)
这里需要说明的是传入的参数名是下面urls中需要用到的
建立urls.py
自己新建urls文件
格式
url(r’^域名/’, views.方法)
特殊说明
通过html传递参数除了可以用get来获取 还可以直接通过正则函数来传递
获取数据
将需要的参数传入(\d+)中 然后就def中提取出来使用
url(r’^stu/(\d+)/’, views.show)
通过给工程和app的url取别名可以在jajin2或者views中使用
namespace和name
url(r’^cla/’,include(‘sst.urls’,namespace=’s’))
url(r’^stu/(\d+)/’, views.show,name=’add’)
{% url ‘namespace(工程urls里别名设置):name(app的urls别名设置)’ 提供的需要的参数 %}
<a href="{% url 's:add' c.id %}">
urls中指定参数
?P<参数名>\d+
url(r'^tiao/(?P<c(参数名)>\d+)/', views.redirectStu,name='tt'),
自己写的HTML中
如果是给用户填写数据然后保存到数据库中
需要用到form actioin=’/之前设置路径(urls)/ method=“post”
<form action="/s/addstu/" method="post">
姓名:<input type="text" name="name">
性别:<input type="text" name="sex">
生日:<input type="date" name="birth">
语文:<input type="text" name="yuwen">
数学:<input type="text" name="shuxue">
<input type="submit" value="提交">
</form>
Jinjia2后面我们做详细的说明