यहां पुनर्निर्देशन का उपयोग करके मेरा जेनेरिक समाधान है, यह सिर्फ जांचता है कि क्या कोई जीईटी पैरामीटर हैं, यदि कोई मौजूद नहीं है तो यह डिफ़ॉल्ट रूप से पैरामीटर के साथ पुनर्निर्देशित करता है। मेरे पास एक 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 सेट नहीं है इसलिए यह डिफ़ॉल्ट पैरामीटर और रीडायरेक्ट का उपयोग करेगा। यह मेरे लिए ठीक है, यह बहुत अच्छा काम करता है जब आप व्यवस्थापक फ़िल्टर के माध्यम से क्लिक करते हैं।
अद्यतन :
कैविएट के चारों ओर जाने के लिए, मैंने एक कस्टम फ़िल्टर फंक्शन लिखना शुरू किया, जिसने चेंजलिस्ट_व्यू फंक्शनालिटी को सरल बनाया। यहाँ फिल्टर है:
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)
और चैंजस्टिस्ट_व्यू अब केवल डिफ़ॉल्ट पैरामीटर पास करता है यदि कोई भी मौजूद नहीं है। यह विचार था कि जेनरेटर फिल्टर की क्षमता से छुटकारा पाने के लिए सभी को बिना किसी मापदण्ड का उपयोग किए देखना होगा। सभी को देखने के लिए मैंने उस उद्देश्य के लिए = 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)