美文网首页用Django2.0来开发
三【用django2.0来开发】后台会员管理(二) ModelA

三【用django2.0来开发】后台会员管理(二) ModelA

作者: aox_lei | 来源:发表于2018-10-30 09:12 被阅读0次

    上一节我们生成了一个会员的模型, 这一节主要讲如何控制会员模块在后台的操作, 包括控制后台中会员模块列表的展示以及新增/编辑页面的表单和新增编辑时的验证

    项目地址:django_example

    运行开发服务器

    > cd cms
    > python manager.py runserver
    

    打开浏览器http://127.0.0.1:8000/admin
    就可以看到后台的登录窗口

    创建超级管理员

    因为我们还没有后台的超级管理员, 先用命令行创建一个

    > cd cms
    > python manager.py createsuperuser
    

    按照提示输入Username, Password即可, 在浏览器中输入账号密码就可以登录到后台了

    将Account模块注册到后台中

    登录成功后发现没有我们的Account模块, 现在我们就来把Account模块注册到后台中

    # account/admin.py
    from django.contrib import admin
    from .models import Account
    
    admin.site.register(Account)
    

    然后再刷新浏览器, 就会发现出现了Account模块, 但是显示的界面全都是英文的

    另外还有一种装饰器的注册方式

    from django.contrib import admin
    from .models import Account
    
    @admin.register(Account)
    class AccountAdmin(admin.ModelAdmin):
        pass
    

    也会实现同样的效果

    将django中文化

    django当然替我们想到了这一点

    # cms/settings.py
    # 指定语言为中文
    LANGUAGE_CODE = 'zh-Hans'
    # 指定时区
    TIME_ZONE = 'PRC'
    # 改为False, 存入数据库的时间才正常, 否则会比正常时间少八个小时
    USE_TZ = False
    

    用ModelAdmin来修改管理界面与操作

    from django.contrib import admin
    from .models import Account
    
    @admin.register(Account)
    class AccountAdmin(admin.ModelAdmin):
        # 控制列表页按钮显示位置
        actions_on_top = False
        actions_on_bottom = True
    
        # 是否显示列表页数据数量([选中了n个中的m个])
        actions_selection_counter = True
    

    ModelAdmin是后台指定模块的一个控制类, 包括后台的列表页面样式、数据、以及编辑/新增, 操作方法等都由这个类控制, 当继承这个类, 我们就可以通过覆盖这个类的方法, 来完成我们的一些操作

    ModelAdmin的配置参数

    actions
    指定自定义的操作列表
    如果是定义的function, 则
    actions = [函数名]
    如果是class的function, 则
    actions = ['类中的方法名']

    actions_on_top
    指定列表页按钮的是否在上边, 设置为True则在上面

    image.png

    actions_on_bottom
    同actions_on_top, 只不过是是否在下方

    image.png

    date_hierarchy
    只可作用在DateField和DateTimeField上, 设置后, 可以根据时间段, 去过滤数据

    class AccountAdmin(models.ModelAdmin):
        ...忽略其他代码
        date_hierarchy = 'create_time'
    
    image.png

    exclude
    排除新增/编辑页面需要显示的字段

    fields
    指定新增、编辑页面要显示的字段

    fields = ('account', 'nickname', 'password', 'email', 'phone', 'status')
    

    list_display
    控制列表页要显示的字段

    list_display = ('account', 'nickname', 'email', 'phone', 'status',
                        'create_time')
    

    list_display_links
    指定哪些在列表页显示的字段上加链接

    list_display_links = ('account', )
    

    list_editable
    指定哪些字段可以直接在列表页编辑

     list_editable = ('status', )
    
    image.png

    list_filter
    列表页过滤条件

    list_filter = ('status', )
    
    image.png

    ordering
    排序, 影响order_by

    ordering = ['id]
    

    list_per_page
    控制每页显示的数据数量

    ModelAdmin增加自定义操作

    每个会员的状态有启用和禁用两种, 现在我们想要增加一个操作来批量启用和禁用

    先定义一个操作的方法

    class AccountAdmin(models.ModelAdmin):
        def disable_account(self, request, queryset):
            queryset.update(status=0)
        
        disable_account.short_description='启用'
    

    disable_account包含两个参数
    request 是HttpRequest对象, 包含请求的所有清晰
    queryset 是数据库操作的QuerySet对象, 也就是当我们点击了操作按钮后, 就会执行queryset.filter(id__in=选中的id).update(status=0), django已经提前帮我们写好了queryset.filter()这部分写好了。

    disable_account.short_description是指定这个操作在后台显示的名称

    定义好方法后, 需要将操作的方法写入到actions属性中才会生效

    class AccountAdmin(models.ModelAdmin):
        actions = ['disable_ccount']
        def disable_account(self, request, queryset):
            queryset.update(status=0)
        
        disable_account.short_description='启用'
    

    同样的, 我们可以再定义一个enable_accoun方法。
    然后在列表页的动作中, 就可以看到我们定义的操作了

    另一种增加自定义操作的方法

    这种方法可以用在一般通用方法中, 比如我们的account模型有一个is_deleted字段, 这个字段的意思是在数据删除后, 设置is_deleted为1, 默认正常时是0, 而django默认的删除操作是直接物理删除数据, 所以我们需要重写删除的方法

    # account/admin.py
    from django.contrib import admin
    
    # 禁用默认的删除操作
    admin.site.disable_action('delete_selected')
    

    这样就会禁用掉默认的删除操作

    # 重新定义一个删除操作
    def deleted_select(self, request, queryset):
        queryset.update(is_deleted=1)
    

    原理和之前我们增加操作方法一样
    将这个操作注册到admin站点中

    admin.site.add_action(deleted_select, '删除数据')
    

    add_action第一个参数是操作的函数名, 第二个是显示的按钮

    修改ModelAdmin默认的数据查询方法

    在我们修改了删除操作后, 发现即使我们删除了数据, 列表中还是会出现, 这个是不符合我们预期的
    所以我们要重写ModelAdmin的查询数据方法, 过滤掉is_deleted=1的数据

    class AccountAdmin(admin.ModelAdmin):
        ...省略代码
        def get_queryset(self, request):
            queryset = super().get_queryset(request)
            return queryset.filter(is_deleted=0)
    

    第一步queryset = super().get_queryset(request), 就是获取到ModelAdmin的查询对象QuerySet, 然后增加过滤条件filter, 然后ModelAdmin会继续操作查询的方法。

    至此, 我们的会员管理列表的全部操作就讲完了。下一节, 就需要重点讲一下

    相关文章

      网友评论

        本文标题:三【用django2.0来开发】后台会员管理(二) ModelA

        本文链接:https://www.haomeiwen.com/subject/wkpwtqtx.html