0

Ich habe das Admin-Modell erweitert, so dass ich für jeden Mitarbeiter andere Kunden nur zuweisen kann, wenn sie in der gleichen Gruppe sind.django - Admin-Modell zuweisen Wert zu limit_choices_to von einem anderen Feld im Modell

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 

und erweiterte die Gruppe Admin-Modell

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) 

was im einfach versuchen zu tun ist, um die Client-Liste für jeden Manager-Benutzer durch seine und ihre Gruppenindikator (group_account Feld) zu begrenzen bedeutet, dass die Liste der verfügbaren Kunden diejenigen ist, die die gleiche spezifische Gruppe wie er selbst haben, z. B. "555"

wenn der group_account = '555' im DB das Ergebnis von groups__groupaccount__group_accoun ist t = group_account sind leer
aber wenn ich es ändere Hardcoded zu: groups__groupaccount__group_account = '555' seine Rückkehr das relevante Ergebnis.
ist das möglich und/oder was ist die Alternative?

django 1,9
Dank für die Hilfe

Antwort

0

Sie sollten benutzerdefinierte die formfield_for_foreignkey Methode der StackInline

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 
+0

es perfekt ist, du bist mein Held !!!!!. Ich musste es nur in formfield_for_manytomany ändern. Ich möchte unbedingt wissen, dass du das verstehen kannst – Rafi

Verwandte Themen