2011-06-05 88 views
3

我需要在主Django站点管理页面上显示对象的数量。 例如,在车型列表我需要显示显示Django管理索引中每个模型的实例数

Elephants (6) 

,而不是

Elephants 

我将此代码添加到我的模型:

class Elephant(models.Model): 
    .... 
    class Meta: 
     verbose_name_plural = 'Elephants ' + '(' + unicode(count_elephants()) + ')' 

其中count_elephants()计算的数对象。问题在于verbose_name_plural是在服务器启动时计算的,并且在删除/插入对象时不会调用,因此此计算值变得无关紧要。 是否有可能以正确的方式做到这一点? 谢谢!

回答

6

由于verbose_name_plural用于许多其他方式,所以更好的方法是更改​​管理员索引视图和管理员模板。

但是,由于管理应用程序可以更改,这可能与django的特定版本 有关。我附上了例如从django 1.2.5中获得的修改后的管理员。

(注:我将在地方更换为索引方法使用,但它很可能是更好地继承它,而不是替换法)

作为开始,从Django的复制/的contrib /管理/ sites.py AdminSite.index方法,它是必需的导入,并将其修改为包括计数(一行更改,查找'THIS LINE WAS ADDED“)。将其添加到任何admin.py文件或其他适当的地方:

from django.utils.text import capfirst 
from django import template 
from django.shortcuts import render_to_response 
from django.views.decorators.cache import never_cache 
from django.utils.translation import ugettext as _ 

def index_with_count(self, request, extra_context=None): 
    """ 
    Displays the main admin index page, which lists all of the installed 
    apps that have been registered in this site. 
    """ 
    app_dict = {} 
    user = request.user 
    for model, model_admin in self._registry.items(): 
     app_label = model._meta.app_label 
     has_module_perms = user.has_module_perms(app_label) 

     if has_module_perms: 
      perms = model_admin.get_model_perms(request) 

      # Check whether user has any perm for this module. 
      # If so, add the module to the model_list. 
      if True in perms.values(): 
       model_dict = { 
        'name': capfirst(model._meta.verbose_name_plural), 
        'admin_url': mark_safe('%s/%s/' % (app_label, model.__name__.lower())), 
        'perms': perms, 
        'count': model.objects.count(), # THIS LINE WAS ADDED 
       } 
       if app_label in app_dict: 
        app_dict[app_label]['models'].append(model_dict) 
       else: 
        app_dict[app_label] = { 
         'name': app_label.title(), 
         'app_url': app_label + '/', 
         'has_module_perms': has_module_perms, 
         'models': [model_dict], 
        } 

    # Sort the apps alphabetically. 
    app_list = app_dict.values() 
    app_list.sort(lambda x, y: cmp(x['name'], y['name'])) 

    # Sort the models alphabetically within each app. 
    for app in app_list: 
     app['models'].sort(lambda x, y: cmp(x['name'], y['name'])) 

    context = { 
     'title': _('Site administration'), 
     'app_list': app_list, 
     'root_path': self.root_path, 
    } 
    context.update(extra_context or {}) 
    context_instance = template.RequestContext(request, current_app=self.name) 
    return render_to_response(self.index_template or 'admin/index.html', context, 
     context_instance=context_instance 
    ) 

site.index = never_cache(type(site.index)(index_with_count, site, AdminSite)) 

现在将django/contrib/admin/templates/admin/index.html文件复制到任何模板文件夹的admin/index.html中,以覆盖ori并修改它以显示计数:

{% extends "admin/base_site.html" %} 
{% load i18n %} 

{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% load adminmedia %}{% admin_media_prefix %}css/dashboard.css" />{% endblock %} 

{% block coltype %}colMS{% endblock %} 

{% block bodyclass %}dashboard{% endblock %} 

{% block breadcrumbs %}{% endblock %} 

{% block content %} 
<div id="content-main"> 

{% if app_list %} 
    {% for app in app_list %} 
     <div class="module"> 
     <table summary="{% blocktrans with app.name as name %}Models available in the {{ name }} application.{% endblocktrans %}"> 
     <caption><a href="{{ app.app_url }}" class="section">{% blocktrans with app.name as name %}{{ name }}{% endblocktrans %}</a></caption> 
     {% for model in app.models %} 
      <tr> 
       <th scope="row"> 
       {% if model.perms.change %} 
        <a href="{{ model.admin_url }}">{{ model.name }}</a> 
       {% else %} 
        {{ model.name }} 
       {% endif %} 
       ({{ model.count }}) 
       </th> 

      {% if model.perms.add %} 
       <td><a href="{{ model.admin_url }}add/" class="addlink">{% trans 'Add' %}</a></td> 
      {% else %} 
       <td>&nbsp;</td> 
      {% endif %} 

      {% if model.perms.change %} 
       <td><a href="{{ model.admin_url }}" class="changelink">{% trans 'Change' %}</a></td> 
      {% else %} 
       <td>&nbsp;</td> 
      {% endif %} 
      </tr> 
     {% endfor %} 
     </table> 
     </div> 
    {% endfor %} 
{% else %} 
    <p>{% trans "You don't have permission to edit anything." %}</p> 
{% endif %} 
</div> 
{% endblock %} 

{% block sidebar %} 
<div id="content-related"> 
    <div class="module" id="recent-actions-module"> 
     <h2>{% trans 'Recent Actions' %}</h2> 
     <h3>{% trans 'My Actions' %}</h3> 
      {% load log %} 
      {% get_admin_log 10 as admin_log for_user user %} 
      {% if not admin_log %} 
      <p>{% trans 'None available' %}</p> 
      {% else %} 
      <ul class="actionlist"> 
      {% for entry in admin_log %} 
      <li class="{% if entry.is_addition %}addlink{% endif %}{% if entry.is_change %}changelink{% endif %}{% if entry.is_deletion %}deletelink{% endif %}"> 
       {% if entry.is_deletion %} 
        {{ entry.object_repr }} 
       {% else %} 
        <a href="{{ entry.get_admin_url }}">{{ entry.object_repr }}</a> 
       {% endif %} 
       <br/> 
       {% if entry.content_type %} 
        <span class="mini quiet">{% filter capfirst %}{% trans entry.content_type.name %}{% endfilter %}</span> 
       {% else %} 
        <span class="mini quiet">{% trans 'Unknown content' %}</span> 
       {% endif %} 
      </li> 
      {% endfor %} 
      </ul> 
      {% endif %} 
    </div> 
</div> 
{% endblock %} 

这将做到这一点。 (您仍然需要修改app_index视图才能在应用索引页面中正确查看计数,我将此作为练习留给您:-)

+0

Udi,感谢您的全面回答!此外,这是另一种解决方案,就像我的黑客,但正常工作:) http://groups.google.com/group/django-users/browse_thread/thread/21f16b20410d9dfb – dbf 2011-06-05 15:59:43

相关问题