Python django admin,使用自定义视图扩展admin
我想就这件事请求一些帮助 我已经按照指南为我的管理员添加了一个视图 我使用的代码与网站的代码相同,但出现了一个错误:Python django admin,使用自定义视图扩展admin,python,django,Python,Django,我想就这件事请求一些帮助 我已经按照指南为我的管理员添加了一个视图 我使用的代码与网站的代码相同,但出现了一个错误: 找不到参数为“()”且关键字参数为“{'app_label':'reports'}”的“app_list”的反转。 admin/my_视图工作正常,但是如果我试图访问管理中的其他页面,例如索引页面,我会收到错误消息 代码如下: #someapp/admin.py from django.conf.urls import patterns from django.contrib
找不到参数为“()”且关键字参数为“{'app_label':'reports'}”的“app_list”的反转。
admin/my_视图
工作正常,但是如果我试图访问管理中的其他页面,例如索引页面,我会收到错误消息
代码如下:
#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
另外,在管理员的索引页面中添加一些视图或上下文的最佳方式是什么
更新
我试过安托万·平萨德的答案,并试过:
#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()
并将url.py的url(r'^admin/,include(admin.site.url)),
替换为url(r'^admin/,include(admin\u site.url)),
并获得:
带参数“()”和关键字参数的“app_list”反向
回溯:
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: []
这本指南看起来很旧。我宁愿建议你照办
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()
资料来源:
您还应该更新您的项目/url.py
并将路径('admin/',admin.site.url)
替换为路径('admin/',admin\u site.url)
。不要忘记以前从someapp.admin导入admin_站点。您链接的指南很旧,我很惊讶在过去一年左右没有找到任何直接回答您问题的内容
在应用程序的admin.py中或在方便的地方创建一个新应用程序
在新的AdminSite中创建一个函数,用您的额外URL扩展get\u url()
函数
确保您的项目URL.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
from django.conf.urls import url, include
from my_app.admin import admin_site
urlpatterns = [
url(r'^admin/', admin_site.urls),
...
]
myu项目/url.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
from django.conf.urls import url, include
from my_app.admin import admin_site
urlpatterns = [
url(r'^admin/', admin_site.urls),
...
]
对于Django 1.4+,以下是解决方案:
from django.conf.urls import url
from django.contrib import admin
from .models import MyModel
class MyAdmin(admin.ModelAdmin):
list_display = (...)
def custom_admin_view(self, request):
# your logic here
if request.method == 'POST':
...
else:
...
return HttpResponse(...)
def get_urls(self):
additional_urls = [
url(r'^custom/$', self.admin_site.admin_view(self.custom_admin_view), name='custom')
]
# append your custom URL BEFORE default ones
return additional_urls + super().get_urls()
admin.site.register(MyModel, MyAdmin)
在所有其他URL之前添加自定义URL非常重要。否则,您可能会被重定向到adminchange\u view
下面的代码将作为默认的管理员站点来编写自定义视图
适用于Django>=2.1:
###myproject/admin.py
from django.contrib import admin
from django.http import HttpResponse
class MyAdminSite(admin.AdminSite):
def my_view(self, request): # your custom view function
return HttpResponse("Test")
def get_urls(self):
from django.urls import path
urlpatterns = super().get_urls()
urlpatterns += [
path('my_view/', self.admin_view(self.my_view))
]
return urlpatterns
###myproject/apps.py
from django.contrib.admin.apps import AdminConfig
class MyAdminConfig(AdminConfig):
default_site = 'myproject.admin.MyAdminSite'
###myproject/settings.py
INSTALLED_APPS = [
...
'myproject.apps.MyAdminConfig', # replaces 'django.contrib.admin'
...
]
然后转到请提供完整的回溯。另外,请注意,模式已被弃用。你应该使用url̀
列表。我已经更新了我的帖子,如果还有人对此有问题,你也可以查看该帖子。这有点棘手,但有助于避免在项目上覆盖AdminSite实例。我在Upvoted上详细介绍了如何扩展admin,以获得一个清晰有效的示例。你知道如何在多个项目而不是一个项目中实现这一点吗?@dKen我很困惑。你是说多个Django项目吗?如果是这样的话,我不确定这是否可能。非常抱歉,我把我的命名法弄错了!我想问的是如何让它与多个应用程序一起工作。抱歉搞混了!嗯,这将适用于多个应用程序。。。您只需将实例化的类导入到您的所有应用程序中:从common.admin导入admin_站点
@DanielvanFlymen,第三方应用程序admin是否会以这种方式包含工作?我的意思是,一些软件包在安装并添加到已安装的应用程序之后,自动将自己绑定到索引页,并具有所有功能。