簡體   English   中英

django-管理模型從模型中的另一個字段將值分配給limit_choices_to

[英]django - admin model assign value to limit_choices_to from another field inside the model

我擴展了管理模型,因此對於每位工作人員,我只能分配其他客戶(如果他們屬於同一組)。

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)     
    is_manager = models.BooleanField(default=False)
    group_account = models.CharField(max_length=3,blank=True,null=True)
    clients_assigned = models.ManyToManyField(User, limit_choices_to = Q(groups__groupaccount__group_account=group_account),blank=True,null=True,related_name='+')

class UserProfileInline(admin.StackedInline):
    model = UserProfile
    verbose_name = "User extra"
    verbose_name_plural = "extra"
    filter_horizontal = ('clients_assigned', )
def save_model(self, request, obj, form, change):
    return super().save_model(request, obj, form, change)

class UserAdmin(BaseUserAdmin):
inlines = [UserProfileInline, ]

def get_form(self, request, obj=None, **kwargs):
    #permissions reduce for regular staff 
     if (not request.user.is_superuser):
         self.exclude = ("app")
         self.exclude = ("user_permissions")
         ## Dynamically overriding
         #self.fieldsets[2][1]["fields"] = ('is_active', 'is_staff','is_superuser','groups')
         self.fieldsets[2][1]["fields"] = ('is_active', 'is_staff')
     form = super(UserAdmin,self).get_form(request, obj, **kwargs)
     return form

並擴展了組管理員模型

class GroupAccount(models.Model):
group_account = models.CharField(,max_length=3,blank=True,null=True)
group = models.OneToOneField(Group,blank=True,null=True)
def save(self, *args, **kwargs):
    super(GroupAccount, self).save(*args, **kwargs)

我試圖做的只是通過每個經理用戶及其組指示器(group_account字段)限制每個客戶的客戶列表,這意味着可用的客戶列表是與他自己具有相同特定組的客戶列表,例如“ 555”

當數據庫中的group_account ='555'時,groups__groupaccount__group_account = group_account的結果為空
但是如果我將其硬編碼更改為:groups__groupaccount__group_account ='555',則會返回相關結果。
那有可能和/或其他選擇嗎?

Django 1.9
謝謝您的幫助

您應該自定義StackInline的formfield_for_foreignkey方法

class UserProfileInline(admin.StackedInline):
    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        field = super(UserProfileInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
        if db_field.name == 'clients_assigned':
            u = request.user
            if not u.is_superuser:
                field.queryset = field.queryset.filter(groups__in=u.groups.all())
        return field

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM