Custom columns using Django admin(使用 Django admin 的自定义列)
问题描述
我有一个模型 Data,关联到这样的表(模型 Data 仅由 IntegerField 组成):
I have a model Data, associated to a table like this (The model Data is made up of only IntegerField):
subject | year | quarter | sales |
----------------------------------
1 | 2010 | 1 | 20 |
1 | 2010 | 2 | 100 |
1 | 2010 | 3 | 100 |
1 | 2010 | 4 | 20 |
1 | 2011 | 1 | 30 |
1 | 2011 | 2 | 50 |
1 | 2011 | 4 | 40 |
2 | 2010 | 1 | 30 |
2 | 2010 | 2 | 20 |
[..-GO ON this way...]
我想要一个 django-admin 表,只读有列(当前年份 = 2011,季度 = 1)
I want to have a django-admin table, in read-only having columns (current year = 2011, quarter = 1)
subject | sales current year | sales current quarter | sales last year | sales current quarter last year |
----------------------------------------------------------------------------------------------------------
1 | 110 | 30 | 240 | 20
[AND SO ON]
问题是:使用 django-admin 可以做到吗?出路是什么?
推荐答案
您可以使用 Model 或 ModelAdmin 上的方法作为 list_display代码>.请参阅:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display
You can use methods on your Model or your ModelAdmin as items for list_display. See: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display
由于这些方法在管理员之外也可能有用,我建议将它们添加到您的 Model 中.
Since these are methods that might be useful outside the admin, as well, I'd suggest adding them to your Model.
from django.db.models import Sum
class Data(models.Model):
...
# Method used by `get_current_year_sales` and `get_last_year_sales`
# to stay DRY. Not for use directly in admin.
def get_year_sales(self, year):
qs = self.model._default_manager.filter(year=year)
sales_agg = qs.aggregate(Sum('sales'))
return sales_agg['sales__sum']
# Method used by `get_current_quarter_sales` and `get_last_quarter_sales`
# to stay DRY. Not for use directly in admin.
def get_quarter_sales(self, year, quarter):
qs = self.model._default_manager.filter(year=year, quarter=quarter)
sales_agg = qs.aggregate(Sum('sales'))
return sales_agg['sales__sum']
def get_current_year_sales(self):
return self.get_year_sales(datetime.now().year)
get_current_year_sales.short_description = 'Sales (Current Year)'
def get_last_year_sales(self):
return self.get_year_sales(datetime.now().year-1)
get_last_year_sales.short_description = 'Sales (Last Year)'
def get_current_quarter_sales(self):
# Determine current quarter logic here as `current_quarter`
# `quarter_year` will likely be same as current year here,
# but will need to be calculated for previous quarter
return self.get_quarter_sales(quarter_year, current_quarter)
get_current_quarter_sales.short_description = 'Sales (Current Quarter)'
def get_current_quarter_sales(self):
# Logic here to determine last quarter as `last_quarter`
# Logic to determine what year last quarter was in as `quarter_year`
return self.get_quarter_sales(quarter_year, last_quarter)
get_last_quarter_sales.short_description = 'Sales (Last Quarter)'
short_description 属性决定管理员将在这些方法的行标题中显示的内容.因此,一旦您完成了所有这些,您只需修改 ModelAdmin 的 list_display 属性,例如:
The short_description attribute determines what the admin will show as the row header for these methods. So, once you have all this in place, you need only modify your ModelAdmin's list_display attribute like:
class DataAdmin(admin.ModelAdmin):
...
list_display = ('subject', 'get_current_year_sales', 'get_last_year_sales', 'get_current_quarter_sales', 'get_last_quarter_sales')
这篇关于使用 Django admin 的自定义列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用 Django admin 的自定义列
基础教程推荐
- matplotlib 设置 yaxis 标签大小 2022-01-01
- kivy 应用程序中的一个简单网页作为小部件 2022-01-01
- Kivy 使用 opencv.调整图像大小 2022-01-01
- 在 Django Admin 中使用内联 OneToOneField 2022-01-01
- 究竟什么是“容器"?在蟒蛇?(以及所有的 python 容器类型是什么?) 2022-01-01
- 比较两个文本文件以找出差异并将它们输出到新的文本文件 2022-01-01
- 对多索引数据帧的列进行排序 2022-01-01
- Python,确定字符串是否应转换为 Int 或 Float 2022-01-01
- Python 中是否有任何支持将长字符串转储为块文字或折叠块的 yaml 库? 2022-01-01
- 在 Python 中将货币解析为数字 2022-01-01
