मैं Django व्यवस्थापक परिवर्तन सूची दृश्य के लिए एक कस्टम तर्क में पारित करने की कोशिश कर रहा हूं ताकि मैं सूची को एक विशेष तरीके से फ़िल्टर कर सकूं। मैं 'active_pp' नामक GET पैरामीटर के आधार पर क्वेरी फ़ील्ड को 2 फ़ील्ड्स, start_date और end_date पर फ़िल्टर करना चाहता हूं। मुझे फ़िल्टरिंग को सही तरीके से काम करने के लिए मिला है, लेकिन मैं एक जीईटी क्वेरी पैरामीटर में पास नहीं कर पा रहा हूं जो निर्दिष्ट करता है कि मुझे फ़िल्टर किए गए परिणाम या सामान्य परिणाम दिखाना चाहिए या नहीं।Django व्यवस्थापक कस्टम चेंज सूची तर्क: ओवरराइड /? ई = 1
मुझे पता है कि, सुरक्षा के कारण, Django व्यवस्थापक किसी भी क्वेरी पैरामीटर को फ़िल्टर करता है जो निर्दिष्ट मॉडल फ़ील्ड से संबंधित नहीं है; खराब तर्क खोजने पर, व्यवस्थापक उपयोगकर्ता को वर्तमान दृश्य में रीडायरेक्ट करता है लेकिन जीईटी क्वेरी पैरामीटर को ई = 1 के साथ बदल देता है। मैं अपने कस्टम 'active_pp' पैरामीटर को श्वेतसूची में रखना चाहता हूं, इसलिए पृष्ठ को पुनर्निर्देशित नहीं किया जाएगा और मैं पैरामीटर का उपयोग करने में सक्षम हूं।
यहां क्वेरीसेट अनुकूलन के साथ admin.py में ModelAdmin का एक उदाहरण है।
class FeaduredAdmin(admin.ModelAdmin):
....
def get_changelist(self, request, **kwargs):
from django.contrib.admin.views.main import ChangeList
# Try to get the 'active_pp' query parameter
active_pp = request.GET.get('active_pp',None)
# Define a custom ChangeList class with a custom queryset
class ActiveChangeList(ChangeList):
def get_query_set(self, *args, **kwargs):
now = datetime.datetime.now()
qs = super(ActiveChangeList, self).get_query_set(*args, **kwargs)
return qs.filter((Q(start_date=None) | Q(start_date__lte=now))
& (Q(end_date=None) | Q(end_date__gte=now)))
# use the custom ChangeList class if the parameter exists
if active_pp:
return ActiveChangeList
return ChangeList
क्या कोई जानता है कि कस्टम GET क्वेरीस्ट्रिंग तर्कों को whit_ist में कैसे हटाया जाए?
पढ़ने के लिए और आपके विचार के लिए धन्यवाद, जो
अद्यतन:
Uvasal के दिए गए लिंक का उपयोग करना, मैं ठीक से प्राप्त पैरामीटर श्वेतसूची में सक्षम था।
class ActiveFilterAminForm(forms.Form):
active_pp = forms.CharField()
class FeaduredAdmin(admin.ModelAdmin):
....
# Based on: http://djangosnippets.org/snippets/2322/
advanced_search_form = ActiveFilterAminForm()
def get_changelist(self, request, **kwargs):
from django.contrib.admin.views.main import ChangeList
active_pp = self.other_search_fields.get('active_pp',None)
# now we have the active_pp parameter that was passed in and can use it.
class ActiveChangeList(ChangeList):
def get_query_set(self, *args, **kwargs):
now = datetime.datetime.now()
qs = super(ActiveChangeList, self).get_query_set(*args, **kwargs)
return qs.filter((Q(start_date=None) | Q(start_date__lte=now))
& (Q(end_date=None) | Q(end_date__gte=now)))
if not active_pp is None:
return ActiveChangeList
return ChangeList
def lookup_allowed(self, lookup):
if lookup in self.advanced_search_form.fields.keys():
return True
return super(MyModelAdmin, self).lookup_allowed(lookup)
def changelist_view(self, request, extra_context=None, **kwargs):
self.other_search_fields = {}
asf = self.advanced_search_form
extra_context = {'asf':asf}
request.GET._mutable=True
for key in asf.fields.keys():
try:
temp = request.GET.pop(key)
except KeyError:
pass
else:
if temp!=['']:
self.other_search_fields[key] = temp
request.GET_mutable=False
return super(FeaduredProductAdmin, self)\
.changelist_view(request, extra_context=extra_context)
यह उचित DRY django समर्थन रखने के लिए उपयोगी उपयोगी सुविधा प्रतीत होता है। – dashesy