Django后台扩展(一)

  • A+
所属分类:Django学习

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

Django后台扩展(一)

只显示特定的条件的数据

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

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

python" data-role="codeBlock" data-info="python">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/

李金龙

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: