将基于django类的视图添加到管理站点

将基于django类的视图添加到管理站点,django,admin,class-based-views,Django,Admin,Class Based Views,我已经使用基于类的视图创建了一些表单,现在我想将它们添加到Django管理站点。我只找到了描述向管理站点添加普通视图的方法。基于类的视图的方法返回常规视图,因此您可以从ModelAdmin调用它,如下所示: def review(self, request, id): return MyReviewView.as_view()(request, id) # File: admin.py @admin.register(Book) class BookModelAdmin(admin.M

我已经使用基于类的视图创建了一些表单,现在我想将它们添加到Django管理站点。我只找到了描述向管理站点添加普通视图的方法。

基于类的视图的方法返回常规视图,因此您可以从
ModelAdmin
调用它,如下所示:

def review(self, request, id):
    return MyReviewView.as_view()(request, id)
# File: admin.py
@admin.register(Book)
class BookModelAdmin(admin.ModelAdmin):

    def get_urls(self):
        urls = super().get_urls()
        my_urls = [
            url(r'^awesome-books/$', 
                self.admin_site.admin_view(awesome_book_view)),
        ]
        return my_urls + urls

假设您有以下基于类的视图:

# File: views.py
class MyAwesomeBookView(TemplateView):
    pass
要使用此视图,必须使其
可调用

# File: views.py
awesome_book_view = MyAwesomeBookView.as_view()
一旦视图可调用
,就可以像对待基于函数的视图一样对待它

要将其链接到管理员URL,可以执行以下操作:

def review(self, request, id):
    return MyReviewView.as_view()(request, id)
# File: admin.py
@admin.register(Book)
class BookModelAdmin(admin.ModelAdmin):

    def get_urls(self):
        urls = super().get_urls()
        my_urls = [
            url(r'^awesome-books/$', 
                self.admin_site.admin_view(awesome_book_view)),
        ]
        return my_urls + urls

您可以将基于类的视图的
作为\u视图
直接传递,而不需要像另一个答案所建议的那样使用变量
awesome\u book\u视图

例如:

admin.py
中,我有:

class EmailAdmin(admin.ModelAdmin):

    def get_urls(self):
        urls = super(EmailAdmin, self).get_urls()
        my_urls = [
            url(r'^send_email/$',
                self.admin_site.admin_view(SendEmailAdminView.as_view())),
        ]
        return my_urls + urls

admin.site.register(Email, EmailAdmin)
class SendEmailAdminView(View):

    def get(self, request):
        pass

    def post(self, request):
        pass
views.py
中,我有:

class EmailAdmin(admin.ModelAdmin):

    def get_urls(self):
        urls = super(EmailAdmin, self).get_urls()
        my_urls = [
            url(r'^send_email/$',
                self.admin_site.admin_view(SendEmailAdminView.as_view())),
        ]
        return my_urls + urls

admin.site.register(Email, EmailAdmin)
class SendEmailAdminView(View):

    def get(self, request):
        pass

    def post(self, request):
        pass

为了简洁起见,我删除了大部分代码,只保留了相关部分。您可以看到完整的。

要与Django admin模板进行完整集成,您可以将模型admin作为额外参数传递给基于类的视图,然后使用它向上下文添加一些糖:

文件admin.py:

from django.contrib import admin
from .models import MyModel
from .views import ProcessObjectView

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):

    def get_urls(self):
        info = self.model._meta.app_label, self.model._meta.model_name
        urls = super().get_urls()
        my_urls = patterns('',
            url(r'^(?P<object_id>.*)/process/$',
                self.admin_site.admin_view(ProcessObjectView.as_view()),
                {'model_admin': self, },
                name="%s_%s_process" % info),
        )
        return my_urls + urls
文件进程\u object.html:

{% extends "admin/change_form.html" %}
{% load i18n utils_tags %}

{% block content %}
...

欢迎来到SO。准备被否决而被遗忘。:)请阅读关于形成详细、有用的问题的指导原则。这个主题实际上很有趣,但你通过问“什么都不做”使它颠倒过来@PhilippWiesner,建议:实现你在链接中读到的内容。所以,这可能是你真正的问题;)是的,这两个问题都是相互关联的,因为这是我的第一个问题。
as\u view()接受1个位置参数,但使用
admin\u站点提供了2个位置参数。
每个上下文(self.request)
()可能会给你一个更全面的上下文。这是一个相当复杂但非常详细的问题-因此令人鼓舞回答。谢谢