2011-05-11 2 views
0

장고 관리자를 배우고 있는데, 그들 사이에 일대 다 관계가있는 모델이 필요합니다. 다른 제조업체를 추가 할 수있는 제조업체 모델과 자동차를 추가 할 수있는 자동차 모델과 같은 제품이 있습니다. 내 장고 관리자 페이지에서 나는 manufacturer1 항목을 클릭하면 manufacturer1라고 manfuctred 모든 자동차의 display_list 수 싶습니다.부모 모델의 일대 다 표현 목록

제조사 관리 모델에서 인라인 모델을 사용하여 트릭을 발견했습니다. 문제는 데이터베이스의 모든 항목이로드되고 큰 테이블이므로 시간이 걸리는 것입니다.

다른 방법이 있습니까, 아니면 새 템플릿을 만들어야합니까?

편집 : 목표는 당신은 어떤 해킹 필요하지 않습니다

답변

1

당신은 두 가지 옵션이 있습니다.

가장 쉬운 방법은 반대의 관계를 살펴 보는 것입니다. 대신 제조업체 변경 양식을보고 모든 차량을 보았습니다. 자동차 변경 목록으로 이동하여 제조업체별로 필터링하십시오. 제조업체에 포함하려면 ModelAdmin 차량의 list_filter 속성을 설정해야합니다.

옵션 2는 큰 고통이 될 수 있지만 제조업체 제조업체 ModelAdminchange_view을 무시하면 extra_context에 해당 제조업체의 자동차 목록이 추가됩니다. 그런 다음 'templates/admin/yourapp/manufacturer/change_form.html'에서 admin 템플릿을 무시해야합니다. 그런 다음 해당 템플릿에 추가하여 extra_context에 전달 된 자동차 목록을 사용하여 'django/contrib/admin/templates/change_list.html'에 영감을 얻기 위해 원하는 목록을 만들 수 있습니다.

Django docs on the Admin을 철저히 읽으십시오. 실제로 거기에 풍부한 정보가 있습니다.

+0

나는 list_filter 아이디어가 마음에 든다! – Chakib

1

페이지에서 결과 분할로 display_list과 동일한 화면을 얻을 뿐이다 InlineModelAdmin와 같은 Manufacturer1에 FK를있는 모든 자동차를로드 할 수 없습니다 . DGango 관리자는 InlineModelAdmin 권한을 사용하고 의도 한대로 Manufacturer1을 선택하면 Manufacturer1에 FK가있는 자동차 만 표시합니다. 업데이트 된 질문에 대한

+0

네, 맞습니다.하지만 InlineModelAdmin은 Manufacturer1에 Fk가있는 모든 자동차를로드하지만 display_list는 거대한 항목에 매우 편리한 페이지로 나눕니다. – Chakib

1

답변 :

ProxyModels 및 재정의를 사용하여 수 할 수있는 방법

ModelAdmin.queryset 당신은 FordCar, GMCar를 통해 Car 모델을 확장하고 모두의 Meta 클래스 proxy=True를 사용 그.

FordCarGMCar 각각에 대해 별도의 관리자를 등록하고 각 ModelAdmin에서 queryset 메서드를 재정 의하여 해당 제조업체를 필터링 할 수 있습니다.

예는 :

class FordCarAdmin(admin.ModelAdmin) 
    list_display = fields = ['name','model','engine'] 

    def queryset(self,request): 
     qs = super(MyModelAdmin, self).queryset(request) 
     return qs.filter(manufacturer__name='Ford') 

admin.site.register(FordCar,FordCarAdmin) 
+0

예를 들어 고맙습니다. 그러나 프록시 모델에 대해서는 몰랐습니다. 각 브랜드의 ModelAdmin을 만들어야하는 경우 새로운 제조업체를 동적으로 생성 할 수 없습니다. – Chakib