一、站点管理
(1) 创建模型Grade和Students在models.py中
实例
class Grade(models.Model):
gname = models.CharField(max_length=20)
ggirlnum = models.IntegerField(default=30)
gboynum = models.IntegerField(default=40)
isDelete = models.BooleanField(default=False)
createTime = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.gname
class Meta:
db_table = 'grade'
class Students(models.Model):
sname = models.CharField(max_length=10,default='xxx')
ssex = models.BooleanField(default=True)
sage = models.IntegerField(default=20)
sinfo = models.CharField(max_length=100,default='个人简介')
isDelete = models.BooleanField(default=False)
sgrade = models.ForeignKey(Grade)
def __str__(self):
return self.sname
class Meta:
db_table = 'students'
执行迁移
python3 manage.py makemigrtions
python3 manage.py migrate
(2) 配置admin应用(默认是添加好的)
INSTALLED_APPS = [
'django.contrib.admin',
]
(3) 创建管理员用户
命令
python3 manage.py createsuperuser
提示为:依次输入 用户名->邮箱->密码->确认密码
(4) 执行汉化
在settings.py文件中修改如下代码
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
(5) 访问
127.0.0.1:8000/admin/
(6) 在admin.py文件下添加要展示使用的模型类进行注册展示
from django.contrib import admin
from .models import Grade,Students
# Register your models here.
#注册模型类 在admin站点进行展示
admin.site.register(Grade)
admin.site.register(Students)
(7) Grade进行字段的展示添加等修改
#创建一个后台字段展示的类
class GradeAdmin(admin.ModelAdmin):
#字段显示属性
list_display = ['pk','gname','ggirlnum','gboynum','isDelete']
#过滤字段
list_filter = ['gname']
#搜索字段
search_fields = ['gname']
#分页
list_per_page = 5
#改变字段的顺序 添加 修改
# fields = ['gname','ggirlnum','gboynum','isDelete']
# 字段分组 添加 修改
fieldsets = [
('num',{"fields":['ggirlnum','gboynum']}),
('base',{"fields":['gname','isDelete']}),
]
admin.site.register(Grade,GradeAdmin)
注意:
fields 和 fieldsets不能同时存在
(8) Students进行字段的展示添加等修改
实例
class StudentsAdmin(admin.ModelAdmin):
# 搜索字段
search_fields = ['sname']
# 分页
list_per_page = 5
def mySex(self):
if self.ssex:
return '男'
else:
return '女'
mySex.short_description = "性别" #并显示性别的男女
# list_display = ['pk','sname','ssex','sage','sgrade','isDelete']
list_display = ['pk','sname',mySex,'sage','sgrade','isDelete']
#过滤字段
list_filter = ['sname']
#动作位置
actions_on_top = True
actions_on_bottom = False
# 字段分组 添加 修改
fieldsets = [
('分组', {"fields": ['sname', 'sage','ssex','sgrade','isDelete']}),
]
admin.site.register(Students,StudentsAdmin)
(9) 关联学生模型 实现在创建班级的时候 添加几个学生的数据
实例:
# class StudentsAdd(admin.TabularInline): #学生在添加时 横着显示
class StudentsAdd(admin.StackedInline): #学生在添加时 纵向显示
model = Students #关联模型
extra = 2 #数据的条数
#创建一个后台字段展示的类
class GradeAdmin(admin.ModelAdmin):
inlines = [StudentsAdd]
(10) 使用装饰器完成注册
@admin.register(Grade)
#创建一个后台字段展示的类
class GradeAdmin(admin.ModelAdmin):
...
@admin.register(Students)
class StudentsAdmin(admin.ModelAdmin):
...
# admin.site.register(Grade,GradeAdmin)
# admin.site.register(Students,StudentsAdmin)
二、分页
(1) Paginator 类
创建对象
格式: Paginator(数据对象,整数)
返回值: 分页对象
属性:
- count 对象的总数
- num_pages 页面总数
- page_range 页码列表
方法:
page(num) page对象 参数为页码
异常:
- 当像page传递一个无效页码的时候抛出异常 InvalidPage
- 传递参数不是一个整数时 则抛出 PageNotAnInteger
- 当像page传递一个有效参数 但是没有对应页面的数据时 则抛出 EmptyPage
(2) Page 对象
Paginator(数据对象,整数) page()方法 返回page对象 不需要手动创建
属性:
- object_list: 当前页上所有数据的列表
- number 当前页码数值
- paginator 当前的paginator对象
- has_next 是否有下一页
- has_previous 是否有上一页
- has_other_pages 判断是否有上一页或者下一页
- next_page_num 返回下一页的页码
- previous_page_num 返回上一页的页码
views.py
实例
def index(req):
g = Grade.objects.all() #获取所有班级数据
paninator = Paginator(g,2) #每页3条
try:
page = int(req.GET.get('page',1)) #获取get传递过来的页码数
except:
page = 1
p = paninator.page(page) #获取每页的对象
return render(req,'index.html',{'data':p}) #传递渲染
index.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>首页</title>
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<h1>你好,世界!</h1>
{% for grade in data.object_list %}
<p>--{{ grade.gname }}-----{{ grade.ggirlnum }}-</p>
{% endfor %}
<nav aria-label="Page navigation">
<ul class="pagination">
<li ><a href="{% url 'App:index' %}?page=1">first</a></li>
<li {% if not data.has_previous %}class="disabled"{% endif %}>
<a {% if data.has_previous %}href="{% url 'App:index' %}?page={{ data.previous_page_number }}"{% endif %} aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
{% for page in data.paginator.page_range %}
<li {% if page == data.number %} class="active"{% endif %}><a href="{% url 'App:index' %}?page={{ page }}">{{ page }}</a></li>
{% endfor %}
<li {% if not data.has_next %} class="disabled"{% endif %}>
<a {% if data.has_next %}href="{% url 'App:index' %}?page={{ data.next_page_number }}"{% endif %} aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
<li><a href="{% url 'App:index' %}?page={{ data.paginator.num_pages }}">last</a></li>
</ul>
</nav>
<a href="?page=1">get传参</a>
<script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</body>
</html>
我写了无数个面向对象的程序
却还是找不到对象
我会python这么美的编程语言
却没能打动你的芳心
我构造了许多方法
却没让你爱上我
你不是我的private
更不是我可以调用的public
你只是他的 protected
我try着靠近你
你却爱答不理
我想except你的心
但也没有finally
三、文件上传
配置:
- 表单必须为post
- 更改enctype的值
存储路径
- 创建 /static/upload
配置settings.py文件
MDEIA_ROOT=os.path.join(BASE_DIR,'static/upload')
文件上传的属性和方法:
- myFile.read() 从文件中读取整个上传的数据(适用于小文件上传)
- myFile.chunks() 按块来返回文件 通过for循环进行迭代 将数据量大的文件按块写入到服务器中
- myFile.multiple_chunks() 会根据文件大于或者小于2.5M 返回True或者False 判断使用chunks还是read进行文件的上传
- myFile.name 获取文件上传的名称
- myFIle.size 返回文件的大小
views.py
#文件上传
def upload(req):
if req.method == 'GET':
return render(req,'form.html')
if req.method == 'POST':
file = req.FILES.get('file')
# print(file.name)
# print(file.size)
newName = str(uuid.uuid4())+os.path.splitext(file.name)[-1]
# path = os.path.join(settings.MDEIA_ROOT,file.name)
path = os.path.join(settings.MDEIA_ROOT,newName)
# print(path)
with open(path,'wb') as f:
if file.multiple_chunks():
print('chunk')
for chunk in file.chunks():
f.write(chunk)
else:
print('read')
f.write(file.read())
return HttpResponse('上传上来了')
form.py
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>文件上传</h2>
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
<p><input type="file" name="file" required></p>
<p><input type="submit" value="上传"></p>
</form>
</body>
</html>
四、富文本编辑器
(1) 安装:
pip3 install django-tinymce
(2) 在settings.py文件中进行配置
INSTALL_APPS 添加 tinymce
#配置富文本
TINYMCE_DEFAULT_CONFIG = {
'theme':'advanced',
'width':600,
'height':400,
}
(3) 创建模型类
models.py
#创建富文本 编辑器存储数据的模型
from tinymce.models import HTMLField
class Text(models.Model):
article = HTMLField()
执行迁移
(4) 创建form表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="/static/tiny_mce/tiny_mce.js"></script>
<script>
tinyMCE.init({
'mode':"textareas",
'theme':'advanced',
'width':800,
'height':600,
})
</script>
</head>
<body>
<form action="">
<textarea name="" id="" cols="30" rows="10"></textarea>
<p><input type="submit"></p>
</form>
</body>
</html>
(5) 配置站点信息
from .models import Text
admin.site.register(Text)
评论 (0)