Django значок CMS в меню - PullRequest
       20

Django значок CMS в меню

0 голосов
/ 06 января 2020

Я пытаюсь показать мой загруженный значок на навигации, но, думаю, я иду неверным путем.

это моя модель, которая расширилась

class IconExtension(PageExtension):
    image = models.ImageField(upload_to='icons')


extension_pool.register(IconExtension)

, и это моя cms_toolbars.py file

@toolbar_pool.register
class IconExtensionToolbar(ExtensionToolbar):
    # defines the model for the current toolbar
    model = IconExtension

    def populate(self):
        # setup the extension toolbar with permissions and sanity checks
        current_page_menu = self._setup_extension_toolbar()

        # if it's all ok
        if current_page_menu:
            # retrieves the instance of the current extension (if any) and the toolbar item URL
            page_extension, url = self.get_page_extension_admin()
            if url:
                # adds a toolbar item in position 0 (at the top of the menu)
                current_page_menu.add_modal_item(_('Page Icon'), url=url,
                    disabled=not self.toolbar.edit_mode_active, position=0)

и это мое меню. html file

{% load menu_tags %}

{% for child in children %}
<li class="child{% if child.selected %} selected{% endif %}{% if child.ancestor %} ancestor{% endif %}{% if child.sibling %} sibling{% endif %}{% if child.descendant %} descendant{% endif %}">
    <a href="{{ child.attr.redirect_url|default:child.get_absolute_url }}">{{ child.get_menu_title }}
    <img src="{{ child.image.url }}">
  </a>
    {% if child.children %}
    <ul>
        {% show_menu from_level to_level extra_inactive extra_active template "" "" child %}
    </ul>
    {% endif %}
</li>
{% endfor %}

Я не понимаю, почему он не работает, я не вижу даже ошибки Я не вижу здесь URL-адреса изображения, у меня все работает нормально, только проходит проблема с отображением значка меню, кто-нибудь может мне помочь в этом случае?

1 Ответ

1 голос
/ 07 января 2020

Похоже, вам просто не хватает ссылки на объект со страницы, вы переходите прямо к его атрибуту.

У меня очень похожая настройка с изображениями, связанными со страницами;

class PageImage(PageExtension):
    """ Add images to pages """
    image = models.FileField(
        verbose_name=_("Image"),
        upload_to=upload_to('page_images')
    )

Что в моих шаблонах становится;

{% if request.current_page.pageimage.image %}
    {{ request.current_page.pageimage.image.url }}
{% endif %}

Так что в вашем примере, если бы вы сделали это в шаблоне, вы бы сделали;

{% if request.current_page.iconextension %}
    <img src="{{ request.current_page.iconextension.image.url }}">
{% endif %}

Проверка если расширение существует, важно избегать ошибок атрибутов и т. д. c.

В меню child - это не объект Page, а NavigationNode из системы меню. Так что у него нет вашего расширения.

Я думаю, что правильным решением для этого является настройка навигации Modifier. Документы для этого здесь; http://docs.django-cms.org/en/latest/how_to/menus.html#navigation -modifiers

В качестве альтернативы вы можете установить тег шаблона, которому вы передадите свой child, который затем может использовать атрибут reverse_id для запроса к базе данных Page, который соответствует и возвращает iconextension этой страницы. Я использовал этот метод раньше.

...