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

 

为了实现记录级的权限控制,在必须在每一个model中都要增加一个创建者(的字段,才有可能实

 

现记录级的权限控制。但一一给每个model类增加创建者字段,还是比较费事的。现在通过model

 

继承的方法来解决此问题。

models.py:

 

from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Author(models.Model):
    author = models.ForeignKey(User)
    
    
    class Meta:
        abstract = True
        
class A(Author):
    a = models.CharField(max_length=5)
    
    def __unicode__(self):
        return "%s:%s" % (self.author,self.a)
    
class B(Author):
    b= models.CharField(max_length=5)
    
    def __unicode__(self):
        return "%s:%s" % (self.author,self.b)
 

将Author model设为abstract,则可以使用得不必生成author数据表。model A与model B继承自

 

Author,所以model A与model B都有字段author.

为了实现权限控制,最重要的内容是在admin.py中:

 

from app.models import *

class AuthorAdmin(admin.ModelAdmin):
    model = Author
    
    def get_model_class(self):
        raise NotImplementedError 
    
    def queryset(self,request):
	model_class = self.get_model_class()
        if request.user.is_superuser:
            return model_class.objects.all()
        return model_class.objects.filter(author=request.user)

    
class AAdmin(AuthorAdmin):
    def get_model_class(self):
        return A
    
class BAdmin(AuthorAdmin):
    def get_model_class(self):
        return B

admin.site.register(A,AAdmin)
admin.site.register(B,BAdmin)
 

因为Author model是abstract的,没有生成相应的表,也没有objects,所以queryset

 

(self,request)中不能通过Author.objects来获取相应的函数。如何在父类中获取子类名称,是

 

一个难题。现在是能过建立一个get_model_class()函数来解决,子类继承AuthorAdmin后,必须

 

重载get_model_class(),以返回正确的model类。

AuthorAdmin类实现了权限控制,所有继承于它的类都有了权限控制了。

你可能感兴趣的:(django)