2016-03-24 91 views
1

在我的ModelAdmin中,我计算了两个聚合值并希望显示带有小部件的值。在Django Admin中使用一个小部件的聚合值Admin

def get_queryset(self, request): 
     qs = super(QuizAdmin, self).get_queryset(request).annotate(
      avg_difficulty=Avg('ratings__difficulty'), 
      avg_rating=Avg('ratings__rating'), 
     ) 
     return qs.filter(author__agents=request.user) 

目前我在做这个

def avg_difficulty(self, obj): 
     return StarRatingWidget().render(attrs={'id': 'id_avg_difficulty'},name="avg_difficulty", value=obj.avg_difficulty, readonly=True) 

有没有更简单和更灵活的使用窗口小部件的总价值呢?在ModelForm中注册似乎不起作用。

回答

1

这是正确的做法,但是,如果您的小部件仅用于这种情况,您甚至不需要小部件。例如,你可以这样做:

from django.utils.html import format_html 

class MyModelAdmin(admin.ModelAdmin): 

    readonly_fields = ['avg_difficulty'] 

    def avg_difficulty(self, obj): 
     return format_html(
      ('<span id="id_avg_difficulty" class="rater" ' 
      'data-value="{}"></span>'), obj.avg_difficulty) 
    avg_difficulty.short_description = "Average difficulty" 
+0

我想多次使用这个小部件,既作为一个输入,也作为一个只读部件。我有一个额外的问题,我想用它来管理列表项,但如果我这样做,Media类中的资源不会被加载。你有任何想法如何解决这个问题? – Silvester

+1

您也可以将Media类添加到ModelAdmin中:https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#modeladmin-asset-definitions –