आप उपयोग करना कोई आपत्ति नहीं है django.contrib.admin.site.AdminSite()
का उप-वर्ग, जब आपको customize your admin site की आवश्यकता होती है, तो मुझे लगता है कि व्युत्पन्न कक्षा में "अनुक्रमणिका" और "app_index" विधियों को फिर से लिखना एक व्यवहार्य विचार है। आप दो शब्दकोशों का उपयोग करके कस्टम ऑर्डरिंग कर सकते हैं जो सेटिंग.py में ऐप घोषणापत्र आदेश और मॉडल के पंजीकरण आदेश को संग्रहीत करते हैं। फिर 'name'
के बावजूद इस क्षेत्र द्वारा ऐप_लिस्ट और ऑर्डर में एक कस्टम ऑर्डर फ़ील्ड्स ('order'
) जोड़कर, मूल AdminSite().index()
और app_index()
के कोड को फिर से लिखें।यह कोड है app_index()
को छोड़कर, कि index()
समारोह के समान है:
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)
आप कस्टम AdminSite का उपयोग करते हैं और आप प्रमाणीकरण मॉडल आप शायद अपने कोड में यह कहीं जरूरत शामिल करना चाहते हैं (मैं इसे एक विशिष्ट में किए गए एप्लिकेशन extend user information करने के लिए:।
from django.contrib.auth.models import User, Group
from myproject import admin
admin.site.register(User)
admin.site.register(Group)
यह मेरे लिए ठीक काम करता है => http://djangosnippets.org/snippets/2613/ – Serafeim
@Serafeim इसके लिए धन्यवाद। एक बार जब मैंने अपने सर्वर को अपग्रेड किए जाने के परिणामस्वरूप विभिन्न 32-बिट बनाम 64-बिट पायथन/डीजेंगो समस्याओं का समाधान किया है, तो मैं इसे एक बार दूंगा! – Phil