91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

擴展Django admin的list_filter()可使用范圍方法

發布時間:2020-09-12 21:51:11 來源:腳本之家 閱讀:321 作者:kkevinyang 欄目:開發技術

需求描述

有時候我們會基于已有數據生成一列在表格中,類似于下面的

class BaseSchema(models.Model):
 ...
 def test_status(self):
 # pdb.set_trace()
 if datetime.date.today() < self.test_start_date:
  return '未到測試區間'
 elif self.test_end_date and datetime.date.today() > self.test_end_date:
  return format_html('<p >已下線</p>')
 else:
  return format_html('<p >進行中</p>')

 test_status.short_description = u'測試狀態'

但同時我們也希望可以對這一列進行篩選,按常規的話也就是添加到list_filter中:

list_filter = ('test_status')

這時候我們會看到django的溫馨報錯:

The value of 'list_filter[0]' refers to 'test_status', which does not refer to a Field. 

也就是說不能使用list_filter對非Field進行篩選。

解決辦法

最簡單的方法

那就是把這個字段記錄進field啊,這樣就可以用了。但是我并不想這么做

更高端的方法

參考https://stackoverflow.com/questions/12102697/creating-custom-filters-for-list-filter-in-django-admin/45136544#45136544第二個回答中的事例:

from django.contrib.admin import SimpleListFilter

class CountryFilter(SimpleListFilter):
 title = 'country' # or use _('country') for translated title
 parameter_name = 'country'

 def lookups(self, request, model_admin):
 countries = set([c.country for c in model_admin.model.objects.all()])
 return [(c.id, c.name) for c in countries] + [
  ('AFRICA', 'AFRICA - ALL')]

 def queryset(self, request, queryset):
 if self.value() == 'AFRICA':
  return queryset.filter(country__continent='Africa')
 if self.value():
  return queryset.filter(country__id__exact=self.value())

class CityAdmin(ModelAdmin):
 list_filter = (CountryFilter,)

現在我們知道django中是這樣實現的篩選的方法,那我們只要覆蓋這個方法就好了:

class StatusFilter(SimpleListFilter):
 title = 'status'
 parameter_name = 'status'

 def lookups(self, request, model_admin):
 return [(1, '已下線'), (2, '進行中'), (3, '未到測試區間')]

 def queryset(self, request, queryset):
 this_day = datetime.date.today()
 # pdb.set_trace()
 if self.value() == '3':
  return queryset.filter(test_start_date__gt=this_day)
 elif self.value() == '1':
  return queryset.filter(test_end_date__lt=this_day)
 elif self.value() == '2':
  return queryset.filter(test_end_date__gte=this_day, test_start_date__lte=this_day)

然后在添加進list_filter中:

list_filter = (StatusFilter,)

bingo!

擴展Django admin的list_filter()可使用范圍方法

以上這篇擴展Django admin的list_filter()可使用范圍方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

同仁县| 收藏| 兰坪| 枞阳县| 谢通门县| 苗栗县| 开江县| 瑞安市| 衡水市| 云南省| 雷波县| 信阳市| 宁城县| 灵山县| 渭南市| 鹤壁市| 乌拉特中旗| 巩义市| 马龙县| 大埔区| 平乡县| 德兴市| 莱州市| 荥阳市| 孟州市| 绥化市| 洞头县| 侯马市| 丰镇市| 西乌| 岳普湖县| 延安市| 荆门市| 仙居县| 墨玉县| 理塘县| 滨州市| 阜平县| 和政县| 金寨县| 曲靖市|