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

Phi*_*ner 1 django admin class-based-views

我使用基于类的视图创建了一些表单,现在我想将它们添加到Django Admin站点.我刚刚找到此链接,其中描述了向管理站点添加普通视图.

Yeo*_*Yeo 6

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

# File: views.py
class MyAwesomeBookView(TemplateView):
    pass
Run Code Online (Sandbox Code Playgroud)

要使用此视图,您必须进行此操作 callable

# File: views.py
awesome_book_view = MyAwesomeBookView.as_view()
Run Code Online (Sandbox Code Playgroud)

一旦你的观点出现callable,你几乎可以像对待基于函数的视图一样对待它.

要将其链接到管理网址,您可以执行以下操作:

# 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
Run Code Online (Sandbox Code Playgroud)


Mar*_*ndi 6

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

文件管理.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
Run Code Online (Sandbox Code Playgroud)

文件views.py

from django.contrib.auth import get_permission_codename

class ProcessObjectView(UpdateView):

    model = MyModel
    pk_url_kwarg = "object_id"
    fields = [... ]
    template_name = 'admin/backend/mymodel/process_object.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        # see http://www.slideshare.net/lincolnloop/customizing-the-django-admin
        model_admin = self.kwargs['model_admin']
        opts = model_admin.model._meta
        admin_site = model_admin.admin_site
        has_perm = self.request.user.has_perm(opts.app_label + '.' + get_permission_codename('change', opts))
        context.update({
            'admin_site': admin_site.name,
            'title': 'Process: ' + str(self.get_object()),
            'opts': opts,
            'app_label': opts.app_label,
            'has_chage_permission': has_perm,
        })

        return context
Run Code Online (Sandbox Code Playgroud)

文件process_object.html:

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

{% block content %}
...
Run Code Online (Sandbox Code Playgroud)

  • 使用 `admin_site.each_context(self.request)` ([docs](https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.AdminSite.each_context))可能会给出给你一个更全面的背景。 (3认同)