Django后台扩展(一)

李金龙
李金龙
管理员
552
文章
0
粉丝
Django学习Django后台扩展(一)已关闭评论4,046字数 744阅读模式

Django自带的Admin十分强大,能快速帮助我们建立一个公司后台。但公司的每个人权限不免需要作区分,并且可能我们需要增加用户字段,这个时候就需要自己对Django的后台做扩展了。

Django后台扩展(一)

只显示特定的条件的数据

譬如销售这个职位,我们只希望他只能看到自己的客户信息,但管理员能看到所有的客户信息。

只需要在对应的admin类里覆盖get_queryset方法

def get_queryset(self, request):
    # 调用父类方法获取全部数据
    qs = super().get_queryset(request)
    # 判断用户是否为管理员
    if request.user.is_superuser:
        # 返回全部数据
        return qs
    # 筛选特定条件的数据
    return qs.filter(username=request.user)

自定义用户模型

扩展用户字段十分简单,首先自己建一个app,在其中定义用户model如下

from django.contrib.auth.models import AbstractUser


class User(AbstractUser):
    tel = models.CharField('联系电话', max_length=11, blank=True, null=True)

    def __str__(self):
        return self.username

    class Meta(AbstractUser.Meta):
        pass

然后在项目的settings.py里增加AUTH_USER_MODEL = 'APPNAME.User'以指定user_models到自定义的模型。
最后删除所有migrations目录下的非__init__.py文件,删库重建。官方文档解释,如果不这样做,可能会导致生成数据库时出现依赖问题。

并且,对应的admins.py也需要从原有的UserAdmin里继承过来

from django.contrib.auth.admin import UserAdmin

@admin.register(User)
class User_Admin(UserAdmin):
    pass

剩下的就跟普通的models一样用了。

控制不可修改的字段

如上自定义了用户字段,但是我现在希望普通用户登陆进来,不能修改自己的部分字段,管理员则能修改所有字段。共有两个方法

  • readonly(未尝试)
    def changelist_view(self, request, extra_context=None):
        user = request.user
        if not user.is_superuser:
            self.readonly_fields = ("username", "password")
        return super(UserAdmin, self).changelist_view(request, extra_context=None)
    

    即设定只读字段为那些不希望普通用户改的字段名

  • fieldsets
    def changelist_view(self, request, extra_context=None):
        user = request.user
        if user.is_superuser:
            self.fieldsets = (
                    (None, {'fields': ('username', 'password')}),
                    (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
                    (_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
                    (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
                    (('销售信息'), {"fields": ('tel', 'thumbnail')}),
                )
        else:
            self.fieldsets = (
                (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
                (('销售信息'), {"fields": ('tel', 'thumbnail')}),
            )
        return super(UserAdmin, self).changelist_view(request, extra_context=None)
    

    这种方法可以控制用户访问修改页面时显示的字段。

自动填写字段

譬如销售在自己添加销售单子的时候,我们通过上述的方式控制了他只能不能在修改页修改销售单的销售人员。那么如何让表单提交的时候自动将这个字段填补为提交的用户呢

同样的,在对应的admin里复写对应函数即可

def save_model(self, request, obj, form, change):
    obj.author = request.user
    obj.save()

原文链接:https://blog.cathaysian.cn/articles/Django-Admin-Extend-0/

 
李金龙
  • 本文由 李金龙 发表于2018年6月1日 23:33:30
  • 转载请务必保留本文链接:https://www.lijinlong.cc/django/djxs/3116.html
Django学习

自定义Django后台名称

众所周知,Django默认的后台是英文。在修改了Settings之后,Django自带的user改成了中文,自己写的App对应的依旧是英文。 于是花了一些时间来查咋改名字。毕竟中国人更适应中文。 修改...
Django学习

Django1.10 admin后台添加APP与ModelAdmin options

所有的网站都会有前台和后台,前台用于访问,后面用于管理员管理网站(添加网站内容,修改网站内容),之前做的DEDE仿站教程 做的内容就是前台的内容,而后台的内容基本上没怎么涉及。 上图为Django默认...
环境配置

Ubuntu系统nginx安装Mysql教程

本篇内容为Django、Python3、Nginx、uWSGI环境部署教程扩展内容,因为Django本身已经自带了Sqlite的数据库,所以不是所有的用户都需要。   环境说明 1、Ubut...