经过继承实现admin中记录级的权限控制(二)

通过继承实现admin中记录级的权限控制(二)

http://zjxplq.iteye.com/admin/blogs/925711

在具体的使用继承来实现admin来实现的记录级的权限控制中又遇到问题了,在使用admin.TabularInline时,就会发现它的save_model()不会调用。

解决方法如下:

 

from django.contrib import admin
from app.models import *

class AuthorMixin(object):
    exclude = ('author',)
    
    def get_model_class(self):
        raise NotImplementedError 
    
    def queryset(self,request):
        if request.user.is_superuser:
            return self.get_model_class().objects.all()
        return self.get_model_class().objects.filter(author=request.user)
    
    def has_change_permission(self,request,obj=None):
        has_class_permission = super(AuthorMixin, self).has_change_permission(request, obj)
        if not has_class_permission:
            return False
        if obj is not None and not request.user.is_superuser and request.user.id != obj.author.id:
            return False
        return True
    
    def save_model(self,request,obj,form,change):
        if not change:
            obj.author = request.user
        obj.save()
        print type(obj)
        
    def save_formset(self, request,form,formset,change):
        instances = formset.save(commit=False)
        
        for instance in instances:
            instance.author = request.user
            instance.save()
    
class BAdminInline(AuthorMixin,admin.TabularInline):
    model = B
    
    def get_model_class(self):
        return B
    
class AAdmin(AuthorMixin,admin.ModelAdmin):
    inlines = [BAdminInline,]
    
    def get_model_class(self):
        return A
    
class BAdmin(AuthorMixin,admin.ModelAdmin):
    def get_model_class(self):
        return B
 
admin.site.register(A,AAdmin)
admin.site.register(B,BAdmin)

 这样的话不管是在ModelAdmin,还是在TabularInline使用都正常实现功能