django 管理,使用自定义视图扩展管理

新手上路,请多包涵

我想就此事请求一些帮助。

我已按照 指南向我的管理员添加视图。

我使用的是该网站的相同代码,但出现错误:

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

另外,在管理员的索引页面中添加一些视图或上下文的最佳方法是什么?

更新

我试过 Antoine 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

追溯:

 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: []

原文由 Juan Carlos Asuncion 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 450
2 个回答

这个指南看起来很旧。我宁愿建议你关注 django 文档

someapp/admin.py

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

class MyAdminSite(AdminSite):

     def get_urls(self):
         from django.urls import path
         urls = super().get_urls()
         urls += [
             path('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/2.2/django/contrib/admin/sites.py#L194-L205

您还应该更新 project/urls.py 并将 path('admin/', admin.site.urls) --- 替换为 path('admin/', admin_site.urls) 。不要忘记 from someapp.admin import admin_site 之前。

原文由 Antoine Pinsard 发布,翻译遵循 CC BY-SA 4.0 许可协议

您链接的指南很旧,我很惊讶在过去一年左右没有找到任何直接回答您问题的内容。

  1. 在您应用的 admin.py 或方便的地方创建一个新的 管理站点
  2. 在新的 AdminSite 中创建一个函数,用您的额外 URL 扩充 get_urls() 函数。
  3. 确保您的项目 urls.py 链接到新创建的 AdminSite

以下适用于 Python 3.5.1 和 Django 1.9.6。


我的应用程序/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

我的项目/urls.py

 from django.conf.urls import url, include

from my_app.admin import admin_site

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

原文由 Daniel van Flymen 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏