2009-11-03 17 views
14

क्या Django व्यवस्थापक साइट कस्टम दिनांक सीमा द्वारा प्रविष्टियों का चयन कर सकती है, यानी AdminDateWidget के साथ दो का उपयोग कर सकते हैं? मुझे पता है कि date_hierarchy और list_filter गुण हैं, लेकिन बहुत सी डीबी प्रविष्टियां होने पर वे बहुत उपयोगी नहीं लगती हैं और आपको केवल date__gte और date__lte क्वेरी द्वारा आइटम फ़िल्टर करने की आवश्यकता है।Django व्यवस्थापक में कस्टम दिनांक सीमा द्वारा फ़िल्टरिंग

उत्तर

20

नोट: मैंने 200 9 में यह जवाब लिखा था, जब आवश्यक कार्यक्षमता Django में सार्वजनिक एपीआई के रूप में उपलब्ध नहीं थी। Django 1.4+ के लिए, अन्य उत्तरों देखें।

यह कार्यक्षमता तब तक प्रदान नहीं की जाती है जब तक मुझे पता है, लेकिन आप इसे स्वयं बना सकते हैं।

सबसे पहले, आप यूआरएल में जीईटी तर्क के रूप में date__gte और date__lte का उपयोग करके आइटम फ़िल्टर कर सकते हैं।

उदाहरण के लिए

/admin/myapp/bar/?date__gte=2009-5-1&date__lt=2009-8-1 

यदि आप, आप प्रारंभ और समाप्ति दिनांक के लिए विजेट जोड़ सकते हैं admin/change_list.html टेम्पलेट फ़ाइल को ओवरराइड 2009

तो मई, जून या जुलाई में तारीखों के साथ सभी बार वस्तुओं को प्रदर्शित करेगा , जो आवश्यक यूआरएल पर नेविगेट करता है। एक और तो सवाल यह है, जो मुझे तर्क के रूप में क्वेरीसमूह फिल्टर पैरामीटर का उपयोग कर के बारे में पढ़ाया जाता है करने के लिए Daniel's answer को


Hat टिप।

+0

धन्यवाद बहुत, बहुत उपयोगी सुविधा। –

5

DateRangeFilter() वर्ग https://github.com/runekaagaard/django-admin-filtrate में पाया करता है सिर्फ इतना है कि :)

+0

Django 1.4 –

+0

के लिए काम नहीं कर रहा है 1.4 पर परीक्षण नहीं किया गया है तो शायद नहीं। मुझे लगता है कि 1.4 में एक नया व्यवस्थापक फ़िल्टर एपीआई है जो चीज़ों को हिला देगा। –

3

मैं यह कुछ इस तरह लागू करने समाप्त हो गया:

# admin.py 
class FooAdmin(MyModelAdmin): 

    def changelist_view(self, request, extra_context=None): 

     extra_context = extra_context or {} 
     try: 
      extra_context['trade_date_gte'] = request.GET['date__gte'] 
     except: 
      pass 

     try: 
      extra_context['trade_date_lte'] = request.GET['date__lte'] 
     except: 
      pass 

    return super(FileNoteAdmin, self).changelist_view(request, extra_context) 


# change_list.html 

{% extends "admin/admin/change_list.html" %} 
{% load i18n admin_static admin_list %} 
{% load url from future %} 
{% load admin_urls %} 


{% block filters %} 

{% if cl.has_filters %} 
    <div id="changelist-filter"> 
    <h2>{% trans 'Filter' %} </h2> 

<h3>By trade date</h3> 

<link href="/media/css/ui-lightness/jquery-ui-1.8.19.custom.css" rel="stylesheet" type="text/css"/> 
<script src="/media/js/jquery/jquery-min.js"></script> 
<script src="/media/js/jquery/jquery-ui-1.8.19.custom.min.js"></script> 

<script> 

    $(function() { 
     $("#trade_date_gte").datepicker({ dateFormat: 'yy-mm-dd'{% if trade_date_gte %}, defaultDate: '{{ trade_date_gte }}'{% endif %} }); 
     $("#trade_date_lte").datepicker({ dateFormat: 'yy-mm-dd'{% if trade_date_lte %}, defaultDate: '{{ trade_date_lte }}'{% endif %} }); 
    }); 

function applyDateFilters() { 

    qs = location.search; 

    if (qs.charAt(0) == '?') qs = qs.substring(1); 

    var qsComponents = qs.split(/[&;]/g); 

    new_qs = []; 
    for (var index = 0; index < qsComponents.length; index ++){ 

     var keyValuePair = qsComponents[index].split('='); 
     var key   = keyValuePair[0]; 
     var value  = keyValuePair[1]; 

     if(key == 'trade_date__gte' || key == 'trade_date__lte' || key == '') { 
      continue; 
     } else { 
      new_qs[index] = key + '=' + value; 
     } 
    } 

    if($("#trade_date_gte").val() != '') { 
     new_qs[new_qs.length] = 'trade_date__gte=' + $("#trade_date_gte").val(); 
    } 
    if($("#trade_date_lte").val() != '') { 
     new_qs[new_qs.length] = 'trade_date__lte=' + $("#trade_date_lte").val(); 
    } 

    window.location = '?' + new_qs.join("&"); 
} 
</script> 

<p> 
From: <br /><input type="text" id="trade_date_gte" value="{{ trade_date_gte|default:'' }}" size="10"><br /> 
To: <br /><input type="text" id="trade_date_lte" value="{{ trade_date_lte|default:'' }}" size="10"> 
</p> 

<ul> 
    <li><a href="#" onclick="javascript:applyDateFilters();">Apply date filters</a></li> 
</ul> 

    {% for spec in cl.filter_specs %}{% admin_list_filter cl spec %}{% endfor %} 
    </div> 
{% endif %} 
{% endblock %} 

तारीख स्तंभ फ़िल्टर किए जा रहे "trade_date" है।

+0

अब मैं आपके फ़िल्टर (थोड़ा अनुकूलित) का उपयोग करके समाप्त हुआ - django-admin-filtrate के संदर्भ में अभी भी कुछ भी नहीं है। अभी भी 1.4 समर्थन – kosta5

32

django 1.4 में, आप उपयोगकर्ता list_filter कर सकते हैं। प्रयास करें:

from django.contrib.admin import DateFieldListFilter 
class PersonAdmin(ModelAdmin): 
    list_filter = (
     ('date_field_name', DateFieldListFilter), 
    ) 

यह कुछ निर्मित पर्वतमाला दे देंगे, लेकिन अगर आप की तरह यूआरएल में दिनांक सीमा डाल दिया, यह काम करेगा:

?date__gte=2009-5-1&date__lt=2009-8-1 

आप एक दिनांक पिकर (jQuery) की तरह की जरूरत है , आपको DateFieldListFilter का विस्तार करने की आवश्यकता है। मैंने django-admin-filtrate पर एक पैच भेजा, तो, जल्द ही वहां जांचें।

+1

की कमी है क्या यह django grappeli व्यवस्थापक के साथ काम करेगा? – andi

+0

@andi इसे काम करना चाहिए। – maciek

5

अब मानक Django API का उपयोग करके कस्टम व्यवस्थापक फ़िल्टर को आसानी से कार्यान्वित करना संभव है। डॉक्स दिन कि list_filter में, अब आप जोड़ सकते हैं:

एक वर्ग django.contrib.admin.SimpleListFilter है, जो आपको और PARAMETER_NAME और लुकअप और क्वेरीसमूह तरीकों

ओवरराइड करने के लिए जिम्मेदार बताते हैं शीर्षक प्रदान करने की आवश्यकता से इनहेरिट

और वे आगे demo (दूसरी बुलेट तक स्क्रॉल) पर जाएं। मैंने इसे फ़िल्टर जोड़ने के लिए स्वयं का उपयोग किया है जिसका ऑब्जेक्ट्स के अंतर्निहित संबंध मॉडल विशेषताओं के माध्यम से नहीं हैं, लेकिन उन पर विधियों के परिणाम, पारंपरिक फ़िल्टर जो कुछ नहीं देते हैं।

+1

डाउन-वोट क्यों? – nemesisfixx

+0

वास्तव में, बहुत उपयोगी, टीएक्स – ptim

संबंधित मुद्दे