darklow / django-suit

Modern theme for Django admin interface
http://djangosuit.com/
Other
2.31k stars 701 forks source link

Creating a blank admin page triggers suit menu error? #672

Closed gamesbook closed 6 years ago

gamesbook commented 6 years ago

If this is a bug please specify versions you're using first.

Django version: 1.11.9 Django Suit version: 2.0a1 Python version: 3.4.3

Issue:

I'd like to create a "blank" admin page (content to be filled dynamically but not a normal admin form or admin list) for one of my apps. It should obviously have the normal (customised) header, menu and footer. However when I try with even a minimal template:

{% extends 'admin/base.html' %}

{% block content %}
  <p>test</p>
{% endblock %}

I get this error:

Environment:

Request Method: GET
Request URL: http://127.0.0.1:8001/query/

Django Version: 1.11.9
Python Version: 3.4.3
Installed Applications:
['django.contrib.contenttypes',
 'django.contrib.auth',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.humanize',
 'django.contrib.staticfiles',
 'crispy_forms',
 'authtools',
 'easy_thumbnails',
 'django_extensions',
 'dal',
 'dal_select2',
 'smart_selects',
 'selectable',
 'projectx.settings.apps.SuitConfig',
 'django.contrib.admin',
 'crash',
 'accounts',
 'home',
 'core',,
 'lookup',
 'query',
 'statistics',
 'uploads',
 'debug_toolbar']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'projectx.middleware.changelist.AdminSessionMiddleware',
 'debug_toolbar.middleware.DebugToolbarMiddleware']

Template error:
In template /home/derek/dev/gitlab/projectx/code/projectx/templates/suit/menu.html, error at line 8
   'NoneType' object is not iterable   1 : {% load i18n suit_menu suit_tags %}
   2 : 
   3 : {% get_menu request as menu %}
   4 : {% with suit_layout='layout'|suit_conf:request %}
   5 :     <div id="suit-nav">
   6 :         <ul>
   7 :             {% if menu %}
   8 :                  {% for parent_item in menu %} 
   9 :                     {% if not parent_item.align_right or suit_layout == 'vertical' %}
   10 :                         {% include 'suit/menu_item.html' %}
   11 :                     {% endif %}
   12 :                 {% endfor %}
   13 :             {% endif %}
   14 :         </ul>
   15 :         {% if menu.aligned_right_menu_items %}
   16 :             <ul class="suit-nav-right">
   17 :                 {% for parent_item in menu.aligned_right_menu_items %}
   18 :                     {% include 'suit/menu_item.html' %}

Traceback:

File "/home/derek/.virtualenvs/projectx3/lib/python3.4/site-packages/django/core/handlers/exception.py" in inner
  41.             response = get_response(request)

File "/home/derek/.virtualenvs/projectx3/lib/python3.4/site-packages/django/core/handlers/base.py" in _legacy_get_response
  249.             response = self._get_response(request)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
  23.                 return view_func(request, *args, **kwargs)

File "/home/derek/dev/gitlab/treeplasm/code/treeplasm/apps/query/views.py" in menu_query
  93.         context={'items': items})

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/shortcuts.py" in render
  30.     content = loader.render_to_string(template_name, context, request, using=using)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/loader.py" in render_to_string
  68.     return template.render(context, request)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/backends/django.py" in render
  66.             return self.template.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render
  207.                     return self._render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/test/utils.py" in instrumented_test_render
  107.     return self.nodelist.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/loader_tags.py" in render
  177.             return compiled_parent._render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/test/utils.py" in instrumented_test_render
  107.     return self.nodelist.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/loader_tags.py" in render
  177.             return compiled_parent._render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/test/utils.py" in instrumented_test_render
  107.     return self.nodelist.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/loader_tags.py" in render
  177.             return compiled_parent._render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/test/utils.py" in instrumented_test_render
  107.     return self.nodelist.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/loader_tags.py" in render
  177.             return compiled_parent._render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/test/utils.py" in instrumented_test_render
  107.     return self.nodelist.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/defaulttags.py" in render
  322.                 return nodelist.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/loader_tags.py" in render
  72.                 result = block.nodelist.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/loader_tags.py" in render
  216.                 return template.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render
  209.                 return self._render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/test/utils.py" in instrumented_test_render
  107.     return self.nodelist.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/defaulttags.py" in render
  529.             return self.nodelist.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/defaulttags.py" in render
  322.                 return nodelist.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/django/template/defaulttags.py" in render
  172.                 values = list(values)

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/suit/menu.py" in __iter__
  59.         for each in self.get_menu_items():

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/suit/menu.py" in get_menu_items
  64.             self.menu_items = self.build_menu()

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/suit/menu.py" in build_menu
  78.         self.map_native_apps()

File "/home/derek/.virtualenvs/projectx/lib/python3.4/site-packages/suit/menu.py" in map_native_apps
  116.         for native_app in self.available_apps:

Exception Type: TypeError at /query/
Exception Value: 'NoneType' object is not iterable
gamesbook commented 6 years ago

It does appear that the error might be on this line:

{% get_menu request as menu %}

but I am not sure what it does or how it sources its information.

My page is called from views.py in the app as:

    return render(
        request=request,
        template_name='query/query_menu.html',
        context={'items': items})
gamesbook commented 6 years ago

Further debugging into the suit code shows that it expects the AdminSite.each_context, which in turn contains available_apps - see: https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#adminsite-methods

So I have altered my render in the view to:

    return render(
        request=request,
        template_name='query/query_menu.html',
        context=dict(
            admin.site.each_context(request),
            items=items)
        )
    )
darklow commented 6 years ago

@gamesbook Yes, each_context is required, see demo here too: http://v2.djangosuit.com/admin/custom/ https://github.com/darklow/django-suit/blob/v2/demo/demo/views.py#L7

jayWarr commented 6 years ago

Thanks for the redirect to this report: I've changed my render statement to

    return render(
    request=request,
    template_name='admin/poetry/document/change_list.html',
    context=dict(admin.site.each_context(request), items=Items)

and included a from django.contrib import admin

at the head of my views.py

but it's failing to find items even when I include from .models import *

I think I'm getting out of my depth - can you help please?

gamesbook commented 6 years ago

Have you tried using dummy data? e.g.

items='dummy data'

I am not sure that passing in that class name (Items) is at all useful?

And, finally, from X import * is considered poor programming practice in Python!