2016-11-20 66 views
0

我有这些模型Django的 - 不同的内联针对不同的用户

class Office(models.Model): 
    name = models.CharField(max_length=255) 

class User(models.Model): 
    name = models.CharField(max_length=255) 
    status = models.SmallIntegerField() 
    office = models.ForeignKey(Office, on_delete=models.SET_NULL, null=True) 

class Inspection(models.Model): 
    place = models.CharField(max_length=255, null=True, blank=True) 

class Jobs(models.Model): 
    inspection = models.ForeignKey(Inspection, on_delete=models.CASCADE) 
    inspector = models.ForeignKey(User, on_delete=models.SET_NULL) 
    cost = models.DecimalField(max_digits=20, decimal_places=2) 

我有不同的用户:普通用户(status=1)和管理员(status=2)。

普通用户可以看到Jobs只有Inspectors从同一间办公室。

管理员可以将任何用户到Inspectors和看到所有Jobs

我可以过滤在同一个办公用户的工作清单:

class JobAdmin(admin.StackedInline): 
    model = Job 
    extra = 0 
    def get_queryset(self, request): 
     qs = super(JobAdmin, self).get_queryset(request) 
     if request.user.status in [1]: 
      qs = qs.filter(inspector__office=request.user.office) 
     return qs 

class InspectionAdmin(ModelAdmin): 
    list_display = ['place'] 
    inlines = [JobAdmin] 

但我怎么可以添加额外的过滤器进行编辑?

如果它不是一个内嵌的形式,我会做这种方式:

class JobAdminForm(ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(JobAdminForm, self).__init__(*args, **kwargs) 

     if self.user.status == 1: #common user 
      self.fields['inspector'].queryset = Inspector.objects.filter(office=self.user.office) 

    class Meta: 
     model = Jobs 
     fields = '__all__' 


class JobAdmin(ModelAdmin): 
    form = JobAdminForm 

    def get_form(self, request, obj=None, **kwargs): 
     form = super(JobAdmin, self).get_form(request, **kwargs) 
     form.user = request.user 
     return form 

回答

1

也许这个代码将是有益的:

class JobAdmin(admin.StackedInline): 
    model = Job 
    extra = 0 

    def get_queryset(self, request): 
     qs = super(JobAdmin, self).get_queryset(request) 
     if request.user.status in [1]: 
      qs = qs.filter(inspector__office=request.user.office) 
     return qs 

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs): 
     if db_field.name == "inspector" and request.user.status == 1: 
      kwargs['queryset'] = Inspector.objects.filter(office=request.user.office) 
     return super().formfield_for_foreignkey(db_field, request, **kwargs) 

附:链接到Django文档:formfield_for_foreignkey

+0

非常感谢。它workds –

+0

@MaslovAndrey在这种情况下,你可以记住我的答案作为一个解决方案? –

相关问题