PYTHON 十月 07, 2019

第7节、站点、分页、文件上传及富文本编辑器

文章字数 13k 阅读约需 12 mins. 阅读次数 1000000

一、站点管理

(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对象 参数为页码

异常:

  1. 当像page传递一个无效页码的时候抛出异常 InvalidPage
  2. 传递参数不是一个整数时 则抛出 PageNotAnInteger
  3. 当像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 %}
        

--{{ grade.gname }}-----{{ grade.ggirlnum }}-

{% 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 %}> {{ page }} {% endfor %} <li {% if not data.has_next %} class="disabled"{% endif %}>

我写了无数个面向对象的程序
却还是找不到对象
我会python这么美的编程语言

却没能打动你的芳心
我构造了许多方法
却没让你爱上我
你不是我的private
更不是我可以调用的public

你只是他的 protected
我try着靠近你
你却爱答不理

我想except你的心

但也没有finally

三、文件上传

配置:

  1. 表单必须为post
  2. 更改enctype的值

存储路径

  1. 创建 /static/upload

  2. 配置settings.py文件

    MDEIA_ROOT=os.path.join(BASE_DIR,'static/upload')

文件上传的属性和方法:

  1. myFile.read() 从文件中读取整个上传的数据(适用于小文件上传)
  2. myFile.chunks() 按块来返回文件 通过for循环进行迭代 将数据量大的文件按块写入到服务器中
  3. myFile.multiple_chunks() 会根据文件大于或者小于2.5M 返回True或者False 判断使用chunks还是read进行文件的上传
  4. myFile.name 获取文件上传的名称
  5. 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%