2010-01-20 30 views
10

Tôi đã có một bộ định dạng nội tuyến và tôi muốn loại trừ một số đối tượng mô hình khỏi hiển thị trong bộ định dạng.Quản trị Django, lọc đối tượng cho formset nội tuyến

Ví dụ: có mô hình B có khóa ngoài để mô hình hóa A, vì vậy nó là một mối quan hệ 1: n (Một đối tượng có nhiều đối tượng B). Bây giờ trên một trang chỉnh sửa admin Tôi đã có inlines của B. Tôi tự hỏi nếu nó có thể bằng cách nào đó để lọc danh sách các đối tượng B trước khi formset nội tuyến được trả lại, do đó, không phải tất cả các đối tượng B liên quan đến A được vào formset.

Trả lời

18

Trả lời cho câu hỏi của riêng có vẻ hơi lạ nhưng tôi tìm thấy một giải pháp khác;)

Có một vấn đề để cung cấp tùy chỉnh QuerySet để một formset, không có móc trong trường hợp formsets inline cho điều này. Vì vậy, tôi phân lớp BaseInlineFormSet và ghi đè phương thức get_queryset. Sau đó, tôi chỉ cung cấp formset này trong InlineModelAdmin và nó được thực hiện.

Ví dụ:

class MyFormSet(BaseInlineFormSet): 
    def get_queryset(self): 
     if not hasattr(self, '_queryset'): 
      qs = super(MyFormSet, self).get_queryset().filter(main=False) 
      self._queryset = qs 
     return self._queryset 

và admin lớp:

class MyInline(admin.TabularInline): 
    model = m.MyModel 
    formset = MyFormSet 
    ... 
+0

Tuyệt vời - đây chỉ là những gì tôi đang tìm kiếm. Sử dụng thuộc tính riêng '_queryset' sẽ ngăn truy vấn SQL kích hoạt hàng chục lần trên mỗi trang. Rất đẹp. – richbs

0

Bạn có thể viết người quản lý của riêng bạn để bạn lập mô hình (đặc biệt cho bộ định dạng) và sử dụng nó.

http://docs.djangoproject.com/en/dev/topics/db/managers/

+0

Thanks a lot. Điều đó trông giống như một giải pháp tốt đẹp, mặc dù tôi sẽ phải sử dụng một số khác (không mặc định) quản lý ở tất cả các nơi khác gây ra tôi cần những đối tượng lọc ra ở khắp mọi nơi chỉ không có trong trang quản trị. Tôi xin lỗi vì không có tùy chọn quản trị để cung cấp tùy chỉnh, không phải trình quản lý mặc định cho nội tuyến. –

+1

Tôi cũng thấy rằng tôi có thể cung cấp truy vấn/quản lý không mặc định cho các dòng nội tuyến bằng cách phân lớp BaseInlineFormSet (http://docs.djangoproject.com/en/1.1/topics/forms/modelforms/#model-formsets) và sau đó cung cấp bộ định dạng này vào InlineModelAdmin bằng thuộc tính 'formset'. Tốt đẹp! –

+0

Nếu bạn viết người quản lý của riêng mình, bạn có thể phải giải quyết thêm nếu mô hình của bạn cũng được đăng ký với Quản trị viên Django. – OverClocked

Các vấn đề liên quan