当django-admin调用模型时调用函数

时间:2010-09-27 13:27:16

标签: django django-models django-admin

我的模型中有这样的东西:

class Artykul(models.Model):

id = models.AutoField(max_length = 5, primary_key = True)
tytul = models.CharField(max_length = 255)

kategoria = models.ManyToManyField(Title, limit_choices_to = choices_limit)


dodano = models.DateField(auto_now_add = True)
autor = models.CharField(max_length = 255)
glowny_obrazek = models.ImageField(blank = True, upload_to="uploads/artykul_main_img")

tresc = PlaceholderField('tresc')



def show_categories(self):
    return ', '.join( self.kategoria.values_list('title', flat=True) )

def prepare_choices_limit(self):
    return {'page__level__exact': 1}

def __unicode__(self):
    return self.tytul

正如您所看到的,我在ManyToManyField中有var choices_limit。我想让它动态化,允许某些用户根据他们的权限拥有不同的选项。我可以通过函数prepare_choices_limit()来做到这一点。问题是:如果这整个想法是好的,如果它不是如何以不同的方式实现这种效果?或者如果它很好,我每次用户登录管理面板时如何调用此函数。我不希望每次调用模型时调用它,因为我不需要为站点的普通用户进行权限检查,仅适用于管理员。

提前致谢 米哈尔

1 个答案:

答案 0 :(得分:0)

class Artykuladmin(models.ModelAdmin):
    def formfield_for_manytomany(self, db_field, request=None, **kwargs):
        formfield= super(ArtykulAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

    if request.user.is_superuser:
        return formfield

    if db_field.name == "kategoria":
        #specify your criteria here:
        qs = Title.objects.filter(page__level__exact=1)
        kwargs["queryset"] = qs

    return db_field.formfield(**kwargs)