2015-05-03 2 views
1

Я создал несколько форм с использованием представлений на основе классов, теперь мне нравится добавлять их на сайт администратора Django. Я нашел только этот link, который описывает добавление обычных просмотров на сайт администратора.Добавить класс на основе класса django на сайт администратора

+1

Добро пожаловать в SO. Приготовьтесь к забвению. :) Пожалуйста, прочтите [эти] (http://stackoverflow.com/help/how-to-ask) рекомендации по формированию подробных, полезных вопросов. – grill

+0

Тема на самом деле интересна, но вы делаете ее вверх дном, задавая «Nothing» ... @PhilippWiesner, предложение: просто реализуйте то, что вы прочитали в ссылке. – Yeo

+0

Итак, возможно, это может быть ваш реальный вопрос;) http://stackoverflow.com/questions/30079979/django-extend-context-of-class-based-view-with-admin-context – Yeo

ответ

1

as_view() метод зрения класса на основе возвращает регулярное представление, так что вы можете вызвать его из ModelAdmin, как это:

def review(self, request, id): 
    return MyReviewView.as_view()(request, id) 
+0

hmm .... Как вам удалось прочесть его мысли: D – Yeo

+0

'as_view() принимает 1 позиционный аргумент, но 2 даны' – Cerin

3

Пусть у вас есть следующий класс, основанный вид:

# File: views.py 
class MyAwesomeBookView(TemplateView): 
    pass 

Чтобы использовать этот взгляд, вы должны это сделать callable

# File: views.py 
awesome_book_view = MyAwesomeBookView.as_view() 

Как только ваш взгляд 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 
+0

Это гораздо более правильный подход –

0

Вы можете пройти класс на основе вид по as_view непосредственно, без необходимости иметь переменную как awesome_book_view как предложили другой ответ:

Пример:

в 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) 

в views.py у меня есть:

class SendEmailAdminView(View): 

    def get(self, request): 
     pass 

    def post(self, request): 
     pass 

Я удалил большую часть кода для краткости и сохранил только соответствующую часть. Вы можете увидеть полный список code here.

0

Для полной интеграции с шаблонами администратора Django, вы можете передать модель админа в качестве дополнительного аргумента в ОЦК, а затем использовать его, чтобы добавить немного сахара в контексте:

файл 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(MyModelAdmin, self).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 

файл 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(ProcessObjectView, self).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 

файл process_object.html:

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

{% block content %} 
... 
Смежные вопросы