首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Django admin自定义列

使用Django admin自定义列
EN

Stack Overflow用户
提问于 2012-02-07 01:46:54
回答 2查看 26.8K关注 0票数 22

我有一个模型Data,与如下所示的表相关联(模型Data只由IntegerField组成):

代码语言:javascript
复制
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表(current year = 2011, quarter = 1)

代码语言:javascript
复制
subject | sales current year | sales current quarter | sales last year | sales current quarter last year |
----------------------------------------------------------------------------------------------------------
  1     |  110               |  30                   |  240            |  20
[AND SO ON]

问题是:使用django-可以做到这一点吗?出路是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-07 03:42:34

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

由于这些方法在管理员之外可能也很有用,我建议将它们添加到您的Model中。

代码语言:javascript
复制
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属性,如下所示:

代码语言:javascript
复制
class DataAdmin(admin.ModelAdmin):
    ...
    list_display = ('subject', 'get_current_year_sales', 'get_last_year_sales', 'get_current_quarter_sales', 'get_last_quarter_sales')
票数 41
EN

Stack Overflow用户

发布于 2012-02-07 02:14:39

像这样的东西应该可以工作(未经测试):

代码语言:javascript
复制
# models.py
class Data(models.Model):
    year = models.DateField()
    sales = models.IntegerField()
    # ...

    def sales_current_year(self):
        return self.model._default_manager.get_queryset().filter(year=2012).annotate(Sum('sales'))

 # admin.py
 class DataAdmin(admin.ModelAdmin):
      list_display = ('sales_current_year',)
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9164610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档