2016-11-20 2 views
0

에 대해 서로 다른 인라인 나는이 모델 장고 다른 사용자

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) 

내가 다른 사용자가있을 수 있습니다.

일반 사용자는 동일한 사무실의 Inspectors으로 만 Jobs을 만들고 볼 수 있습니다.

관리자는 모든 사용자를 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) 

P.S.을 Django 문서에 대한 링크 : formfield_for_foreignkey

+0

고마워요. it works –

+0

@MaslovAndrey이 경우, 해결책으로 내 대답을 표시 할 수 있습니까? –