python - 使用 Django admin 的自定义列

标签 python django django-admin

我有一个模型 Data,关联到这样的表(模型 Data 仅由 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)

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 可以做到吗?出路是什么?

最佳答案

您可以使用 ModelModelAdmin 上的方法作为 list_display 的项目。见:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display

由于这些方法在管理员之外也可能有用,我建议将它们添加到您的 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 属性决定管理员将在这些方法的行标题中显示的内容。因此,一旦您完成了所有这些,您只需修改 ModelAdminlist_display 属性,例如:

class DataAdmin(admin.ModelAdmin):
    ...
    list_display = ('subject', 'get_current_year_sales', 'get_last_year_sales', 'get_current_quarter_sales', 'get_last_quarter_sales')

关于python - 使用 Django admin 的自定义列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9164610/

相关文章:

python - Azure ML本地部署: tarfile. ReadError:无法成功打开文件

python - Python中object的__hash__()和__eq__()的源代码是什么?

javascript - 异步Django,Ajax,Jquery信息

Django:强制 content_type ID

django - 如何使用 Django 对 Redis 进行故障转移

django - django admin 中的依赖字段

python - 关于 pythonanywhere : trouble running the django-admin shell 的 Django 教程

python - Django 的内联管理 : a 'pre-filled' field

python - 无法在 Keras 中训练简单的自动编码器

python - 令人尴尬的并行任务与 Python Parallel(或其他包)取决于不可拾取的对象