为了实现记录级的权限控制,在必须在每一个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类实现了权限控制,所有继承于它的类都有了权限控制了。