2016-03-08 3 views
3

Я хотел бы попросить некоторую помощь по этому вопросу.django admin, расширяющий администратор с пользовательскими представлениями

Я следил за this, чтобы добавить мнение к моему администратору.

Я использую тот же код, что сайт имеет и я получаю сообщение об ошибке:

Reverse for 'app_list' with arguments '()' and keyword arguments '{'app_label': 'reports'}' not found.

admin/my_view работает нормально, но если я пытаюсь получить доступ к другим страницам в админке, такие, как индексная страница Я получаю ошибку

Вот код:

#someapp/admin.py 

from django.conf.urls import patterns 
from django.contrib import admin 
from django.http import HttpResponse 

def my_view(request): 
    return HttpResponse("Hello!") 

def get_admin_urls(urls): 
    def get_urls(): 
     my_urls = patterns('', 
      (r'^my_view/$', admin.site.admin_view(my_view)) 
     ) 
     return my_urls + urls 
    return get_urls 

admin_urls = get_admin_urls(admin.site.get_urls()) 
admin.site.get_urls = admin_urls 

Я использую Django 1.8.2, Python 2 .7

также, как лучше всего добавить какой-либо вид или контекст на индексной странице администратора?

UPDATE

Я попытался ответить Антуана Pinsard и попытался это:

#admin.py 
from django.contrib.admin import AdminSite 
class MyAdminSite(AdminSite): 

    def get_urls(self): 
     from django.conf.urls import url 
     urls = super(MyAdminSite, self).get_urls() 
     urls += [ 
      url(r'^my_view/$', self.admin_view(self.my_view)) 
     ] 
     return urls 

    def my_view(self, request): 
     return HttpResponse("Hello!") 

admin_site = MyAdminSite() 

И замена urls.py-х url(r'^admin/', include(admin.site.urls)), к url(r'^admin/', include(admin_site.urls)),

и получение:

Reverse for 'app_list' with arguments '()' and keyword arguments

след вызовов TRACEBACK:

Request Method: GET 
Request URL: http://localhost:8000/@dmin/ 

Django Version: 1.8.2 
Python Version: 2.7.10 
Installed Applications: 
('grappelli', 
'django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.sessions.models', 
'frontend', 
'file_maintenance', 
'reports', 
'transactions', 
'admin_reorder', 
'admin_notifications', 
'django_twilio', 
'daterange_filter') 
Installed Middleware: 
('django.contrib.sessions.middleware.SessionMiddleware', 
'django.contrib.auth.models.User', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware', 
'django.middleware.security.SecurityMiddleware', 
'admin_reorder.middleware.ModelAdminReorder') 


Traceback: 
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response 
    157.      response = middleware_method(request, response) 
File "C:\Python27\lib\site-packages\admin_reorder\middleware.py" in process_template_response 
    134.   self.init_config(request, app_list) 
File "C:\Python27\lib\site-packages\admin_reorder\middleware.py" in init_config 
    21.   admin_index = admin.site.index(request) 
File "C:\Python27\lib\site-packages\django\views\decorators\cache.py" in _wrapped_view_func 
    57.   response = view_func(request, *args, **kwargs) 
File "C:\Python27\lib\site-packages\django\contrib\admin\sites.py" in index 
    438.         current_app=self.name, 
File "C:\Python27\lib\site-packages\django\core\urlresolvers.py" in reverse 
    579.  return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))) 
File "C:\Python27\lib\site-packages\django\core\urlresolvers.py" in _reverse_with_prefix 
    496.        (lookup_view_s, args, kwargs, len(patterns), patterns)) 

Exception Type: NoReverseMatch at /@dmin/ 
Exception Value: Reverse for 'app_list' with arguments '()' and keyword arguments '{'app_label': 'django_twilio'}' not found. 0 pattern(s) tried: [] 
+0

Просьба предоставить полную отслеживающий. Также обратите внимание, что шаблоны устарели. Вы должны использовать список 'url'. –

+0

Я обновил сообщение –

+0

Если у кого-то еще есть проблема с этим - вы можете проверить это сообщение также https://stackoverflow.com/questions/4877335/how-to-use-custom-adminsite-class. Это немного сложно, но не позволяет переопределить экземпляр AdminSite над проектом. – alexche8

ответ

1

Это руководство выглядит довольно старый. Я бы посоветовал вам следовать за django docs.

someapp/admin.py

from django.contrib.admin import AdminSite 
from django.http import HttpResponse 

class MyAdminSite(AdminSite): 

    def get_urls(self): 
     from django.conf.urls import url 
     urls = super(MyAdminSite, self).get_urls() 
     urls += [ 
      url(r'^my_view/$', self.admin_view(self.my_view)) 
     ] 
     return urls 

    def my_view(self, request): 
     return HttpResponse("Hello!") 

admin_site = MyAdminSite() 

Источник: https://github.com/django/django/blob/1.8/django/contrib/admin/sites.py#L204-L215

Вы должны также обновить project/urls.py и заменить url(r'^admin/', include(admin.site.urls)) на url(r'^admin/', include(admin_site.urls)). Не забудьте также from someapp.admin import admin_site.

+0

Это также означает, что я должен добавить URL вручную в 'myproject/urls' право? если так, я получаю сообщение об ошибке «Включенный urlconf» ', похоже, не имеет никаких шаблонов. Если вы видите допустимые шаблоны в файле, то проблема, вероятно, вызвана циклическим импортом. ' , добавив' url (r '^ my_view /', include (admin_site.urls)), 'в URL-адресах –

+0

У вас ничего нет для добавления в myproject/urls.py, работа уже выполнена. –

+0

Я вижу, я сказал это, потому что я получаю 404 всякий раз, когда я пытаюсь получить доступ к 'admin/my_view' –

3

Руководство, в котором вы были связаны, является старым, и я был удивлен тем, что не нашел ничего прямого ответа на ваш вопрос за последний год или около того.

  1. Создать в admin.py вашего приложения или в удобном месте новый Admin Site.
  2. Создайте функцию в новом AdminSite, который дополняет функцию get_urls() дополнительными URL-адресами.
  3. Убедитесь, что ваш проект urls.py ссылки на новый AdminSite.

Нижеследующее работает с Python 3.5.1 и Django 1.9.6.


my_app/admin.py

from django.contrib import admin 
from django.contrib.admin import AdminSite 
from django.http import HttpResponse 

from my_app.models import SomeModel 


class MyAdminSite(AdminSite): 

    def custom_view(self, request): 
     return HttpResponse("Test") 

    def get_urls(self): 
     from django.conf.urls import url 
     urls = super(MyAdminSite, self).get_urls() 
     urls += [ 
      url(r'^custom_view/$', self.admin_view(self.custom_view)) 
     ] 
     return urls 

admin_site = MyAdminSite() 


@admin.register(SomeModel, site=admin_site) 
class SomeModelAdmin(admin.ModelAdmin): 
    pass 

my_project/urls.py

from django.conf.urls import url, include 

from my_app.admin import admin_site 

urlpatterns = [ 
    url(r'^admin/', admin_site.urls), 
    ... 
] 
+0

Упрощенный для четкого и рабочего примера.Любая идея, как сделать эту работу с _multiple_ проектами, хотя, а не только одним? – dKen

+0

@dKen Я в замешательстве. Вы имеете в виду несколько проектов Django? Если так, я не уверен, что это возможно. –

+0

ужасно жаль, я перепутал свою номенклатуру! Я хотел спросить, как я могу заставить это работать с несколькими _apps_. Извините за беспорядок! – dKen

Смежные вопросы