在django-admin中实现动态form

问题的提出:

有如下models.py:

class A(models.Model):
  user = models.ForeignKey(User)
  name = models.CharField(max_length=10)
 

现在要在django-admin管理界面下进行输入:

1)如当前用户是管理员时,admin管理界面中要出现user这一栏,可以让管理员自由选择

2)如当前用户不是管理员时,admin管理界面中不出现user这一栏,直接指定user为当前用户

现在想到使用一种方法是利用多重继承,代码如下:

class DynamicExcludeMixin(object):
    dynamic_excludes = []
    
    def preprocess_exclude(self,request):
        if not self.exclude:
            self.exclude = []
        for dynamic_exlcude in self.dynamic_excludes:
            if dynamic_exlcude not in self.exclude:
                if not request.user.is_superuser:
                    self.exclude.insert(1,dynamic_exlcude)
            else:
                if request.user.is_superuser:
                    self.exclude.remove(dynamic_exclude)
                
            
    def add_view(self, request, form_url='', extra_context=None):
        self.preprocess_exclude(request)
        return super(DynamicExcludeMixin,self).add_view(request, form_url, extra_context)
    
    def change_view(self, request, object_id, extra_context=None):
        self.preprocess_exclude(request)
        return super(DynamicExcludeMixin,self).change_view(request, object_id, extra_context)

class AAdmin(DynamicExcludeMixin,admin.ModelAdmin):
    dynamic_excludes = ['user',]
    
    def save_model(self,request,obj,form,change):
        if not change:
            if not request.user.is_superuser:
                obj.user = request.user
            
        obj.save()
 

不过这样的实现还是比较麻烦,还得再进行改进。

你可能感兴趣的:(django)