首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-12-27 
通过继承实现admin中记录级的权限控制?为了实现记录级的权限控制,在必须在每一个model中都要增加一个创建

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

?

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

?

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

?

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

models.py:

?

from django.db import modelsfrom 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 Badmin.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类实现了权限控制,所有继承于它的类都有了权限控制了。

热点排行