Nếu bạn không nhớ để sử dụng một lớp con của django.contrib.admin.site.AdminSite()
, như mong đợi trong trường hợp khi bạn cần customize your admin site, tôi nghĩ rằng đó là một ý tưởng khả thi viết lại các phương pháp "index" và "app_index" trong lớp dẫn xuất. Bạn có thể đặt hàng tùy chỉnh bằng cách sử dụng hai bộ từ điển lưu trữ thứ tự khai báo ứng dụng trong settings.py và thứ tự đăng ký của các mô hình. Sau đó viết lại mã của AdminSite().index()
và app_index()
ban đầu, thêm trường đơn hàng tùy chỉnh ('order'
) vào app_list và đặt hàng theo trường này mặc dù 'name'
.Đây là mã, trừ app_index()
, đó là tương tự như index()
chức năng:
class MyAdminSite(AdminSite):
def __init__(self, name='admin', app_name='admin'):
super(MyAdminSite, self).__init__(name, app_name)
# Model's registration ordering. It's not necessary to
# categorize by app.
self._registry_ord = {}
# App ordering determined by declaration
self._app_ord = { 'auth' : 0 }
app_position = 1
for app in settings.INSTALLED_APPS:
self._app_ord[app] = app_position
app_position += 1
def register(self, model_or_iterable, admin_class=None, **options):
super(MyAdminSite, self).register(model_or_iterable, admin_class, **options)
if isinstance(model_or_iterable, ModelBase):
model_or_iterable = [model_or_iterable]
for model in model_or_iterable:
if model in self._registry:
if self._registry_ord:
self._registry_ord[model._meta.object_name] = max(self._registry_ord.values()) + 1
else:
self._registry_ord[model._meta.object_name] = 1
@never_cache
def index(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():
info = (app_label, model._meta.module_name)
model_dict = {
'name': capfirst(model._meta.verbose_name_plural),
'perms': perms,
'order': self._registry_ord[model._meta.object_name]
}
if perms.get('change', False):
try:
model_dict['admin_url'] = reverse('admin:%s_%s_changelist' % info, current_app=self.name)
except NoReverseMatch:
pass
if perms.get('add', False):
try:
model_dict['add_url'] = reverse('admin:%s_%s_add' % info, current_app=self.name)
except NoReverseMatch:
pass
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': reverse('admin:app_list', kwargs={'app_label': app_label}, current_app=self.name),
'has_module_perms': has_module_perms,
'models': [model_dict],
'order': self._app_ord[app_label],
}
# Sort the apps alphabetically.
app_list = app_dict.values()
app_list.sort(key=lambda x: x['order'])
# Sort the models alphabetically within each app.
for app in app_list:
app['models'].sort(key=lambda x: x['order'])
context = {
'title': _('Site administration'),
'app_list': app_list,
}
context.update(extra_context or {})
return TemplateResponse(request, [
self.index_template or 'admin/index.html',
], context, current_app=self.name)
Nếu bạn sử dụng AdminSite tùy chỉnh và bạn muốn bao gồm mô hình Auth có thể bạn cần này, ở đâu đó trong mã của bạn (Tôi đã thực hiện nó trong một cụ thể ứng dụng để extend user information:.
from django.contrib.auth.models import User, Group
from myproject import admin
admin.site.register(User)
admin.site.register(Group)
Điều này làm việc tốt cho tôi => http://djangosnippets.org/snippets/2613/ – Serafeim
@Serafeim Cảm ơn vì điều này. Tôi sẽ cung cấp cho nó một đi một khi tôi đã giải quyết khác nhau 32-bit vs 64-bit python/django vấn đề đã cắt lên như là một kết quả của máy chủ của chúng tôi đang được nâng cấp! – Phil