经过继承实现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使用都正常实现功能