在Django管理界面创建新的自定义视图

8
抱歉,我在django方面还很新。我想在管理站点上创建一个与我的模型无关的自定义视图。我已经阅读了文档(https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_urls),但是没有起作用。阅读一些教程也不行... 这是我尝试过的:

admin.py

from django.contrib import admin
from django.urls import path
from .models import Question
from django.http import HttpResponse

class CustomAdminView(admin.ModelAdmin):
    def get_urls(self):
        urls = super().get_urls()
        my_urls = [
            path(r'^my_view/$', self.admin_site.admin_view(self.my_view))
        ]
        urls = my_urls + urls
        return urls


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


admin.site.register(Question)

urls.py

from django.contrib import admin
from django.urls import path
from django.conf.urls import include, url

admin.autodiscover()
urlpatterns = [
    path(r'polls/',include('polls.urls')),
    path('admin/', admin.site.urls),
]

当我访问admin/my_view时,结果显示404未找到。
我尝试通过扩展AdminView来解决问题。

admin.py

from django.contrib.admin import AdminSite
from django.urls import path
from .models import Question
from django.http import HttpResponse

class CustomAdminView(AdminSite):
    def get_urls(self):
        urls = super().get_urls()
        my_urls = [
            path(r'my_view/', self.admin_view(self.my_view))
        ]
        urls = my_urls + urls
        return urls


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


custom_admin = CustomAdminView()
custom_admin.register(Question)

urls.py

from django.contrib import admin
from django.urls import path
from django.conf.urls import include, url
from polls.admin import custom_admin

admin.autodiscover()
urlpatterns = [
    path(r'polls/',include('polls.urls')),
    path('admin/', custom_admin.urls),
]

我在admin/my_view页面没有收到404错误。但是, 默认的模型(用户和其他)未显示。只有我的“问题”模型在那里。以前的一个仍然有默认的模型。
如何正确制作自定义管理视图? 谢谢。

你的第一个代码片段无法工作,因为你没有在任何地方使用CustomAdminView。 - Daniel Roseman
抱歉,但我不知道在哪里使用它... 当我尝试创建新实例时,因为我不知道要传递什么到__init__中,所以出现了错误。 - Marsha
Django 2.1 将拥有一个钩子,可以轻松地覆盖默认的管理站点。在那之前,这会比较棘手。这个答案可能会对你有所帮助。 - Alasdair
谢谢!我使用第二个代码片段,并注册了Django的默认模型(用户,模型),这些都写在那个答案中。 - Marsha
*(用户和组) - Marsha
1个回答

5
已解决。我正在使用我的第二个admin.py和urls.py片段,并注册Django默认模型,基于这个答案:Django(1.10)覆盖AdminSite

admin.py

from django.contrib.admin import AdminSite
from django.http import HttpResponse
from django.urls import path
from .models import Question
from django.contrib.auth.models import Group, User #add these moduls
from django.contrib.auth.admin import GroupAdmin, UserAdmin #and these

class CustomAdminView(AdminSite):
    def get_urls(self):
        urls = super().get_urls()
        my_urls = [
            path(r'my_view/', self.admin_view(self.my_view))
        ]
        urls = my_urls + urls
        return urls


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


custom_admin = CustomAdminView()
custom_admin.register(Question)

#register the default model

custom_admin.register(Group, GroupAdmin)
custom_admin.register(User, UserAdmin)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接