นี่คือวิธีแก้ปัญหาทั่วไปของฉันโดยใช้การเปลี่ยนเส้นทางเพียงตรวจสอบว่ามีพารามิเตอร์ GET หรือไม่หากไม่มีอยู่ระบบจะเปลี่ยนเส้นทางด้วยพารามิเตอร์ get เริ่มต้น ฉันยังมีการตั้งค่า list_filter เพื่อให้มันเลือกและแสดงค่าเริ่มต้น
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)
ข้อแม้เดียวคือเมื่อคุณเข้าสู่หน้าเว็บโดยตรงด้วย "?" มีอยู่ใน url ไม่มีการตั้งค่า HTTP_REFERER ดังนั้นจะใช้พารามิเตอร์เริ่มต้นและเปลี่ยนเส้นทาง นี่ใช้ได้ดีสำหรับฉันมันใช้งานได้ดีเมื่อคุณคลิกผ่านตัวกรองผู้ดูแลระบบ
อัพเดท :
เพื่อที่จะหลีกเลี่ยงข้อแม้ฉันลงเอยด้วยการเขียนฟังก์ชันตัวกรองแบบกำหนดเองซึ่งทำให้ฟังก์ชัน changelist_view ง่ายขึ้น นี่คือตัวกรอง:
class MyModelStatusFilter(admin.SimpleListFilter):
title = _('Status')
parameter_name = 'status'
def lookups(self, request, model_admin):
return (
(8, _('All')),
(0, _('Incomplete')),
(5, _('Pending')),
(6, _('Selected')),
(7, _('Accepted')),
)
def choices(self, cl):
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):
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)
และตอนนี้ changelist_view จะส่งผ่านพารามิเตอร์เริ่มต้นเท่านั้นหากไม่มีอยู่ แนวคิดคือการกำจัดความสามารถในการกรองข้อมูลทั่วไปเพื่อดูทั้งหมดโดยใช้พารามิเตอร์ไม่รับ หากต้องการดูทั้งหมดที่ฉันกำหนดสถานะ = 8 สำหรับวัตถุประสงค์นั้น:
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)