2017-01-02 3 views
3

Я пытаюсь добавить пользовательскую страницу к администратору без ассоциации модели.Добавить пользовательскую страницу в django admin без модели

Это то, чего я достиг до сих пор.

class MyCustomAdmin(AdminSite): 

    def get_urls(self): 
     from django.conf.urls import url 

     urls = super(MyCustomAdmin, self).get_urls() 
     urls += [ 
      url(r'^my_custom_view/$', self.admin_view(MyCustomView.as_view())) 
     ] 
     return urls 

class MyCustomView(View): 
    template_name = 'admin/myapp/views/my_custom_template.html' 

    def get(self, request): 
     return render(request, self.template_name, {}) 

    def post(self, request): 
     # Do something 
     pass 

admin_site = MyCustomAdmin() 

admin_site.register(MyModel1) 
admin_site.register(MyModel2) 
# etc... 

Это на самом деле работает, но проблема заключается в том, что с этим решением я потерять некоторые приложения из интерфейса администратора Django (счета, Auth, socialaccounts, сайты).

ответ

1

Это связано с тем, что ваши другие администраторы используют по умолчанию admin.site. Вам необходимо полностью заменить admin.site по умолчанию на свой собственный as explained here (вы также можете указать read this too).

Или вы можете просто сделать это поросенок стиль по monkeypatching параметра по умолчанию admin.site.get_urls() метода:

from django.contrib import admin 

_admin_site_get_urls = admin.site.get_urls 

def get_urls():   
    from django.conf.urls import url 
    urls = _admin_site_get_urls() 
    urls += [ 
      url(r'^my_custom_view/$', 
       admin.site.admin_view(MyCustomView.as_view())) 
     ] 
    return urls 

admin.site.get_urls = get_urls 

Ограничение: Я не буду нести ответственность за какие-либо нежелательный побочный эффект этого «решения », в том числе (но не ограничиваясь), ваши сотрудники защищают вас от следующего обзора кода. Это грязное решение. Это беспорядок. Он воняет. Это зло. Вы не должны этого делать.

+0

Спасибо за ваш ответ. Я знаю документацию, и я подумал, что включив django.contrib.admin в INSTALLED_APPS, автообнаружение будет по-прежнему активным. Мне не очень нравится решение переопределить метод get_urls(), и я бы предпочел вручную включить все сторонние приложения. Любые предложения о том, как это сделать? – Pietro

Смежные вопросы