2017-03-28 1 views
1

인라인 반복을 선언하는 Django 관리 클래스가 있습니다. 같은 뭔가 :DjangoAdmin : 인라인 관리자 내에서 부모 인스턴스에 액세스

@admin.register(Category) 
class CategoryAdmin(admin.ModelAdmin): 
    ... 
    ... 
    inlines = [CategoryModifiersInline,] 
    ... 
    ... 

은 그 때 나는 인라인 관리 클래스를 다음과 같이 있습니다 : 나는 일부 비즈니스 요구 사항에 따라 외부 키의 검색어 세트를 필터링

class CategoryModifiersInline(admin.TabularInline): 

    model = Category.modifiers.through 
    fk_name = 'category' 
    extra = 1 


    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     qs = Product.objects.filter(is_modifier=True).filter(active=True) 
     kwargs['queryset'] = qs 
     return super(CategoryModifiersInline, self).formfield_for_foreignkey(db_field, request, **kwargs) 

.

이 인라인은 change보기에서 사용자에게만 표시됩니다. 즉, 범주 클래스의 개체가 만들어지고 수정자를 추가하려고 할 때 add보기에 나타나지 않습니다.

내가하고 싶은 것은 범주 모델의 속성 중 하나를 사용하여 외래 키를 필터링하는 것입니다. 즉, formfield_for_foreignkey 메서드에서 상위 개체에 액세스하려고합니다.

누구나 달성 방법을 알고 있습니까?

답변

0

그럼 여기서 StackOverflow에 similar question을 발견하고 거기에 설명 된 방법을 사용하여 해결했습니다.

인라인의 parent_model 속성과 django.core.urlresolversresolve 메소드를 사용하여 URL을 기반으로 인스턴스를 가져옵니다.

여기에 코드입니다 :

def get_object(self, request): 
     resolved = resolve(request.path_info) 
     if resolved.args: 
      return self.parent_model.objects.get(pk=resolved.args[0]) 
     return None 

그럼 내가 필터로 사용할 개체의 인스턴스를 얻을 내 formfield_from_foreignkey 방법의 내부 get_object 메소드를 호출합니다.

희망이 있습니다.

관련 문제