Đây là giải pháp chung của tôi sử dụng chuyển hướng, nó chỉ kiểm tra xem có bất kỳ tham số GET nào không, nếu không có thì nó chuyển hướng với tham số get mặc định. Tôi cũng có một bộ list_filter để nó chọn và hiển thị mặc định.
from django.shortcuts import redirect
class MyModelAdmin(admin.ModelAdmin):
...
list_filter = ('status', )
def changelist_view(self, request, extra_context=None):
referrer = request.META.get('HTTP_REFERER', '')
get_param = "status__exact=5"
if len(request.GET) == 0 and '?' not in referrer:
return redirect("{url}?{get_parms}".format(url=request.path, get_parms=get_param))
return super(MyModelAdmin,self).changelist_view(request, extra_context=extra_context)
Cảnh báo duy nhất là khi bạn truy cập trực tiếp vào trang bằng "?" hiện trong url, không có bộ HTTP_REFERER nên nó sẽ sử dụng tham số mặc định và chuyển hướng. Điều này ổn đối với tôi, nó hoạt động tuyệt vời khi bạn nhấp qua bộ lọc quản trị viên.
CẬP NHẬT :
Để giải quyết vấn đề báo trước, tôi đã viết một hàm bộ lọc tùy chỉnh để đơn giản hóa chức năng changelist_view. Đây là bộ lọc:
class MyModelStatusFilter(admin.SimpleListFilter):
title = _('Status')
parameter_name = 'status'
def lookups(self, request, model_admin): # Available Values / Status Codes etc..
return (
(8, _('All')),
(0, _('Incomplete')),
(5, _('Pending')),
(6, _('Selected')),
(7, _('Accepted')),
)
def choices(self, cl): # Overwrite this method to prevent the default "All"
from django.utils.encoding import force_text
for lookup, title in self.lookup_choices:
yield {
'selected': self.value() == force_text(lookup),
'query_string': cl.get_query_string({
self.parameter_name: lookup,
}, []),
'display': title,
}
def queryset(self, request, queryset): # Run the queryset based on your lookup values
if self.value() is None:
return queryset.filter(status=5)
elif int(self.value()) == 0:
return queryset.filter(status__lte=4)
elif int(self.value()) == 8:
return queryset.all()
elif int(self.value()) >= 5:
return queryset.filter(status=self.value())
return queryset.filter(status=5)
Và changelist_view bây giờ chỉ chuyển tham số mặc định nếu không có tham số nào. Ý tưởng là loại bỏ khả năng của bộ lọc chung chung để xem tất cả bằng cách sử dụng tham số no get. Để xem tất cả, tôi đã gán trạng thái = 8 cho mục đích đó:
class MyModelAdmin(admin.ModelAdmin):
...
list_filter = ('status', )
def changelist_view(self, request, extra_context=None):
if len(request.GET) == 0:
get_param = "status=5"
return redirect("{url}?{get_parms}".format(url=request.path, get_parms=get_param))
return super(MyModelAdmin, self).changelist_view(request, extra_context=extra_context)