This is modification of Django's original adminapplist template tag. You can move your models from one app to other or completely hide them with this mod.
Copy django_dir/contrib/admin/templates/admin/index.html file to your templates/admin folder, open it, then change {% load adminapplist %} to {% load custom_adminapplist %} (or whatever you named the templatetag file)
After that, write your regrouping schema to settings.py file like this;
UPDATED, now using tupples instead of dicts in APP_SCHEMA to make it more DRY.
`
APP_SCHEMA=[
(
    ['Model','List'],
    'From App',
    'To App',
),
(
    ['FlatPage'],
    'Flatpages',
    'Site Content',
),
(
    ['Product']
    'Product',
    'Shop',
),
(
    ['Site']
    'Sites',
    #We are hiding Site model by not defining a target.
),
]
`
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104  | #
# custom_adminapplist.py 
# place to your templatetags folder
#
from django import template
from django.db.models import get_models
from django.utils.encoding import force_unicode
from django.utils.safestring import mark_safe
from django.conf import settings
register = template.Library()
class AdminApplistNode(template.Node):
    def __init__(self, varname):
        self.varname = varname
        self.schema=hasattr(settings, 'APP_SCHEMA') and settings.APP_SCHEMA or []
    def to_where(self, app, model):
        for itm in self.schema:
            if app==itm[1] and model in itm[0]:
                if len(itm)==3: return itm[2]
                else: return -1
    def render(self, context):
        from django.db import models
        from django.utils.text import capfirst
        app_list = []
        user = context['user']
        transporter={}
        for app in models.get_apps():
            # Determine the app_label.
            app_models = get_models(app)
            if not app_models:
                continue
            app_label = app_models[0]._meta.app_label
            has_module_perms = user.has_module_perms(app_label)
            if has_module_perms:
                model_list = []
                for m in app_models:
                    if m._meta.admin:
                        perms = {
                            'add': user.has_perm("%s.%s" % (app_label, m._meta.get_add_permission())),
                            'change': user.has_perm("%s.%s" % (app_label, m._meta.get_change_permission())),
                            'delete': user.has_perm("%s.%s" % (app_label, m._meta.get_delete_permission())),
                        }
                        # Check whether user has any perm for this module.
                        # If so, add the module to the model_list.
                        if True in perms.values():
                            model={
                                'name': force_unicode(capfirst(m._meta.verbose_name_plural)),
                                'admin_url': mark_safe(u'%s/%s/' % (force_unicode(app_label), m.__name__.lower())),
                                'perms': perms,
                                'pname': m.__name__,
                            }
                            _to=self.to_where(app_label.title(), m.__name__)
                            if not _to:
                                model_list.append(model)
                            else:
                                if _to not in transporter: transporter[_to]=[]
                                transporter[_to].append(model)
                if model_list:
                    # Sort using verbose decorate-sort-undecorate pattern
                    # instead of key argument to sort() for python 2.3 compatibility
                    decorated = [(x['name'], x) for x in model_list]
                    decorated.sort()
                    model_list = [x for key, x in decorated]
                    app_list.append({
                        'name': app_label.title(),
                        'has_module_perms': has_module_perms,
                        'models': model_list,
                    })
        if transporter:
            for app in app_list:
                if app['name'] in transporter:
                    app_list[app_list.index(app)]['models'].extend(transporter[app['name']])
        context[self.varname] = app_list
        return ''
def get_admin_app_list(parser, token):
    """
    Returns a list of installed applications and models for which the current user
    has at least one permission.
    Syntax::
        {% get_admin_app_list as [context_var_containing_app_list] %}
    Example usage::
        {% get_admin_app_list as admin_app_list %}
    """
    tokens = token.contents.split()
    if len(tokens) < 3:
        raise template.TemplateSyntaxError, "'%s' tag requires two arguments" % tokens[0]
    if tokens[1] != 'as':
        raise template.TemplateSyntaxError, "First argument to '%s' tag must be 'as'" % tokens[0]
    return AdminApplistNode(tokens[2])
register.tag('get_admin_app_list', get_admin_app_list)
 | 
More like this
- Add Toggle Switch Widget to Django Forms by OgliariNatan 1 month, 4 weeks ago
 - get_object_or_none by azwdevops 5 months, 2 weeks ago
 - Mask sensitive data from logger by agusmakmun 7 months, 2 weeks ago
 - Template tag - list punctuation for a list of items by shapiromatron 1 year, 9 months ago
 - JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 1 year, 9 months ago
 
Comments
This gives an error:
user = context['user'] on line 26
#
Please login first before commenting.