django admin site常用函数(formfield_for_foreignkey,queryset,get_readonly_fields)

虽然感觉接触django很长时间了,django是一个复杂且灵活的web框架,由于框架用的是python语言,所以在国内还算是比较小众语言和框架。

了解django的人都应该知道django的admin站点管理系统,如果能灵活的应用,那么在项目的开发阶段,他能帮你处理很多后台的事情,使你的开发工作游刃有余。

admin基础的用法这里就不讲了,这里着重强调几个常用的函数,这几个函数在admin中使用的频率还是比较高的。

1.formfield_for_foreignkey(self, db_field, request, **kwargs)

The formfield_for_foreignkey method on a ModelAdmin allows you to override the default formfield for a foreign keys field. For example, to return a subset of objects for this foreign key field based on the user:

本人英文不是很好:看例子

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if not request.user.is_superuser:
            if db_field.name == "catagory":
                shop=Shop.objects.get(username=request.user.username)
                kwargs["queryset"] = Catagory.objects.filter(shop=shop)
        else:
            kwargs["queryset"] =Catagory.objects.all()
        return super(GoodsAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

这里指的是通过 formfield_for_foreignkey方法,可以实现在GoodsAdmin中过滤Category,(Category为GoodsAdmin的外键),即当用户不是超级用户的情况下,只显示当前登录用户的商店的类别,这样当添加商品的时候,就不会把商品添加到其他商店的类别中去了。


2.queryset(self, request)

The queryset method on a ModelAdmin returns a QuerySet of all model instances that can be edited by the admin site. One use case for overriding this method is to show objects owned by the logged-in user

    def queryset(self, request):
        qs = super(ShopAdmin, self).queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(username=request.user.username,boss_verified=True)

这里的queryset的方法,即只显示当前登录用户的所在商店,如果为超级管理员则显示所有商店。也是一种过滤查询,不过不是过滤外键,而是条件过滤。

3.get_readonly_fields(self, request,obj=None)

The get_readonly_fields method is given the HttpRequest and the obj being edited (or None on an add form) and is expected to return a list or tuple of field names that will be displayed as read-only, as described above in the ModelAdmin.readonly_fields section


    def get_readonly_fields(self, request,obj=None):
        fields=[]
        if request.user.is_superuser:
            return fields
        else:
            fields=['boss_verified','deliver_during']
            return fields
这个方法指的是当登录用户不是超级用户的时候,此admin中的boss_verified ,deliver_during两个字段不可编辑,为只读状态。

关于admin的其他函数,django的官方文档都有介绍,但是都是英文文档,有些都没有事例,所以增加了学习的难度,本人有时间会一一介绍下。


你可能感兴趣的:(python)