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

来源:互联网 发布:新疆广电网络官网 编辑:程序博客网 时间:2024/05/21 11:36

虽然感觉接触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)

Thequeryset 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 theHttpRequest and the obj being edited (or None on an add form) and is expected to return alist or tuple of field names that will be displayed as read-only, as described above in theModelAdmin.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的官方文档都有介绍,但是都是英文文档,有些都没有事例,所以增加了学习的难度,本人有时间会一一介绍下。


0 0
原创粉丝点击