2013-05-29 19 views
1

在django-admin中,對於模型,我必須按日期時間範圍進行過濾。django-admin list_filter by datetime range不僅在日期範圍內

我找到了這個: https://github.com/DXist/django-daterange-filter/blob/master/daterange_filter/filter.py 它工作的很好,但只適用於日期範圍,而不是DateTime範圍。

所以我試圖修改的是,這是我自己的版本的目的:

class DateRangeForm(forms.Form): 

    def __init__(self, *args, **kwargs): 
     field_name = kwargs.pop('field_name') 
     super(DateRangeForm, self).__init__(*args, **kwargs) 

     self.fields['%s__gte' % field_name] = forms.DateTimeField(
      label='', widget=AdminSplitDateTime(
       attrs={'placeholder': _('From date')}), localize=True, 
      required=False) 

     self.fields['%s__lte' % field_name] = forms.DateTimeField(
      label='', widget=AdminSplitDateTime(
       attrs={'placeholder': _('To date')}), localize=True, 
      required=False) 


class DateRangeFilter(admin.filters.FieldListFilter): 
    template = 'admin/daterange_filter/filter.html' 

    def __init__(self, field, request, params, model, model_admin, field_path): 
     self.lookup_kwarg_since = '%s__gte' % field_path 
     self.lookup_kwarg_upto = '%s__lte' % field_path 
     super(DateRangeFilter, self).__init__(
      field, request, params, model, model_admin, field_path) 
     self.form = self.get_form(request) 

    def choices(self, cl): 
     return [] 

    def expected_parameters(self): 
     return [self.lookup_kwarg_since, self.lookup_kwarg_upto] 

    def get_form(self, request): 
     return DateRangeForm(data=self.used_parameters, 
          field_name=self.field_path) 

    def queryset(self, request, queryset): 
     if self.form.is_valid(): 
      # get no null params 
      filter_params = dict(filter(lambda x: bool(x[1]), 
             self.form.cleaned_data.items())) 

      for k, v in filter_params.items(): 
       if k.endswith('__lte'): 
        filter_params[k] = v + timedelta(days=1) 

      return queryset.filter(**filter_params) 
     else: 
      return queryset 


admin.filters.FieldListFilter.register(lambda f: isinstance(f, models.DateTimeField), DateRangeFilter) 

「前端」方面,它的工作..它顯示了AdminSplitDateTime組件,但是當我提交了過濾器的形式我得到:

Environment: 


Request Method: GET 
Request URL: http://127.0.0.1:8000/admin/erp/ordine/?data_creazione__gte_0=29%2F05%2F2013&data_creazione__gte_1=12%3A42%3A10&data_creazione__lte_0=&data_creazione__lte_1= 

Django Version: 1.5.1 
Python Version: 2.7.5 
Installed Applications: 
('django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.admin', 
'account', 
'south', 
'mptt', 
'erp', 
'tinymce') 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware') 


Traceback: 
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response 
    115.       response = callback(request, *callback_args, **callback_kwargs) 
File "C:\Python27\lib\site-packages\django\contrib\admin\options.py" in wrapper 
    372.     return self.admin_site.admin_view(view)(*args, **kwargs) 
File "C:\Python27\lib\site-packages\django\utils\decorators.py" in _wrapped_view 
    91.      response = view_func(request, *args, **kwargs) 
File "C:\Python27\lib\site-packages\django\views\decorators\cache.py" in _wrapped_view_func 
    89.   response = view_func(request, *args, **kwargs) 
File "C:\Python27\lib\site-packages\django\contrib\admin\sites.py" in inner 
    202.    return view(request, *args, **kwargs) 
File "C:\Python27\lib\site-packages\django\utils\decorators.py" in _wrapper 
    25.    return bound_func(*args, **kwargs) 
File "C:\Python27\lib\site-packages\django\utils\decorators.py" in _wrapped_view 
    91.      response = view_func(request, *args, **kwargs) 
File "C:\Python27\lib\site-packages\django\utils\decorators.py" in bound_func 
    21.     return func(self, *args2, **kwargs2) 
File "C:\Python27\lib\site-packages\django\contrib\admin\options.py" in changelist_view 
    1180.     self) 
File "C:\Python27\lib\site-packages\django\contrib\admin\views\main.py" in __init__ 
    73.   self.query_set = self.get_query_set(request) 
File "C:\Python27\lib\site-packages\django\contrib\admin\views\main.py" in get_query_set 
    303.   use_distinct) = self.get_filters(request) 
File "C:\Python27\lib\site-packages\django\contrib\admin\views\main.py" in get_filters 
    100.    if not self.model_admin.lookup_allowed(key, value): 
File "C:\Python27\lib\site-packages\django\contrib\admin\options.py" in lookup_allowed 
    263.     model = field.rel.to 

Exception Type: AttributeError at /admin/erp/ordine/ 
Exception Value: 'NoneType' object has no attribute 'to' 

我已經準備了一個半空Django項目(1個光照模型,管理員設置好的了,dev.db sqlite3的),只是爲了測試這個問題:你 可以在這裏找到:https://dl.dropboxusercontent.com/u/53953129/test_project.zip

+0

你有預取相關的地方嗎?這可能是搞砸了 – karthikr

+0

不,我沒有它:/ –

回答

0

您尚未發佈此過濾器的客戶端代碼。 options.py中的'field'變量的值是什麼?

+0

在我的第一篇文章的底部我剛剛添加了一個dropbox鏈接到一個輕的半空django項目只用於測試該問題在香草方式(獨立於我自己的需求)方式。對於你的問題的答案:option.py中的'field'變量具有以下值:https://dl.dropboxusercontent.com/u/53953129/Senza%20titolo-1.png –

0

雖然情況沒有改變......我已經添加了一個小測試項目來玩