2010-06-15 27 views
5

Tôi chỉ mới bắt đầu chơi với Django hôm nay và cho đến nay tôi cảm thấy khá khó khăn để làm những việc đơn giản. Những gì tôi đang đấu tranh với ngay bây giờ là lọc danh sách các loại trạng thái. Mô hình StatusTypes là:Lọc kết quả mô hình cho quản trị Django chọn hộp

class StatusTypes(models.Model): 
    status = models.CharField(max_length=50) 
    type = models.IntegerField() 
    def __unicode__(self): 
     return self.status 
    class Meta: 
     db_table = u'status_types' 

Trong một trang admin Tôi cần tất cả các kết quả trong đó type = 0 và trong một tôi sẽ cần tất cả các kết quả trong đó type = 1 vì vậy tôi không thể chỉ hạn chế nó từ bên trong mô hình. Tôi sẽ đi đâu để tới đó?

CHỈNH SỬA: Tôi nên rõ ràng hơn một chút. Tôi có một mô hình "Đơn vị" trong đó có một khóa nước ngoài để StatusTypes. Các mô hình như sau:

class StatusTypes(models.Model): 
    status = models.CharField(max_length=50) 
    type = models.IntegerField() 
    def __unicode__(self): 
     return self.status 
    class Meta: 
     db_table = u'status_types' 

class Unit(models.Model): 
    name = models.CharField(unique=True, max_length=50) 
    status = models.ForeignKey(StatusTypes, db_column='status') 
    note = models.TextField() 
    date_added = models.DateTimeField() 
    def __unicode__(self): 
     return self.name 
    class Meta: 
     db_table = u'units' 

Vì vậy, bây giờ trong trang quản trị cho các mô hình đơn vị tôi muốn giới hạn trạng thái để chỉ những người có type = 1. Dựa tắt của phản ứng lazerscience dưới đây tôi đã cố gắng đoạn mã sau:

from inv.inventory.models import Unit 
from django.contrib import admin 

class UnitAdmin(admin.ModelAdmin): 
    def queryset(self, request): 
     qs = super(UnitAdmin, self).queryset(request) 
     return qs.filter(type=0) 

admin.site.register(Unit, UnitAdmin) 

Nhưng, nó hoàn toàn không thay đổi hộp chọn. Tôi cũng đã cố gắng in ấn giá trị của qs và không có gì được xuất ra thiết bị đầu cuối của tôi vì vậy tôi tự hỏi nếu tôi có một số queryset gọi như thế nào?

EDIT 2: Có thể không rõ ràng rằng tôi muốn lọc điều này cho menu thả xuống trạng thái trên trang tạo cho mô hình Đơn vị.

Trả lời

3

EDIT:

Nó chỉ ra rằng ModelAdmin.formfield_for_foreignkey là câu trả lời đúng trong tình huống này: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey

TRƯỚC ĐÁP:

Hãy nhìn vào các list_filter attribute of ModelAdmin. Điều đó nghe có vẻ giống như những gì bạn muốn với tôi vì nó sẽ tạo ra một giao diện đẹp để lọc theo các tiêu chí khác nhau hơn là tùy ý hạn chế truy vấn của bạn.

+0

Cảm ơn bạn đã phản hồi.List_filter sẽ không hoạt động vì bạn không thể có một đơn vị có trạng thái kiểu = 0 và trừ khi tôi bị nhầm lẫn list_filter chỉ cần thêm một thanh bên cho người dùng tùy chọn. Tôi hơi ngạc nhiên vì điều này rất khó làm ... ít nhất là tôi vẫn chưa thể tìm được câu trả lời. Tất cả những gì tôi muốn làm là thêm 'WHERE part = 1' vào truy vấn. – blcArmadillo

+0

Có lẽ tôi đang thiếu điểm trên những gì bạn muốn, nhưng nếu bạn thêm 'status' vào danh sách' list_filter', nó sẽ cung cấp cho bạn một widget cho phép bạn lọc dựa trên bất kỳ giá trị cho phép nào cho trường đó. Nó hoạt động bằng cách thêm một tham số get vào url admin, chính xác như những gì bạn cần. –

+0

Gabriel, tôi mới nhận ra sự nhầm lẫn có thể là gì. Tôi muốn lọc các loại trạng thái cho trường chọn trạng thái trên trang thêm. Không thêm cột bộ lọc vào danh sách các Đơn vị đã được thêm. Điều này có giúp làm rõ mọi thứ không? – blcArmadillo

2

Bạn có thể ghi đè lên các phương pháp queryset của lớp MyModelAdmin của bạn:

from django.contrib import admin 

class MyModelAdmin(admin.ModelAdmin): 

    def queryset(self, request): 
     qs = super(MyModelAdmin, self).queryset(request) 
     return qs.filter(type=0) 

admin.site.register(StatusTypes, MyModelAdmin) 

quản lý này sẽ chỉ hiển thị bạn đối tượng của mô hình của bạn có type=0!

+0

Cảm ơn sự giúp đỡ. Sau khi bạn trả lời tôi nhận ra làm thế nào nên có thêm thông tin trong câu hỏi vì những gì tôi đã yêu cầu không phải là những gì tôi cần làm. Tôi đã cố gắng sửa đổi mã của bạn để phù hợp với nhu cầu của tôi cũng như tra cứu một số tài nguyên trên bộ truy vấn ghi đè. Tôi đã cố gắng in giá trị của qs nhưng không có gì xuất phát từ terminal của tôi. Tôi phải bằng cách nào đó gọi queryset? – blcArmadillo

+0

Sau đó, bạn nên lọc bộ truy vấn của mình như sau: 'qs.filter (status__type = 0)'. Cuối cùng bạn đang nói về một trình đơn thả xuống, bạn có ý gì với điều đó? Và có, miễn là bạn có một cái gì đó được lưu, bạn sẽ thấy một cái gì đó trong queryset của bạn. Hãy thử 'python manage.py shell',' từ myapp.models Import Unit', 'Unit.objects.filter (status__type = 0)'; chơi xung quanh với điều đó một chút! –

+0

Cảm ơn sự giúp đỡ. Tôi sẽ xem xét điều đó. – blcArmadillo

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