django-cms перенаправляет меню верхнего уровня на первый дочерний элемент

Я хотел бы перенаправить элементы верхнего меню на странице, которую я пишу, чтобы указать на своих детей, если они есть. Например. этот сайт имеет верхний уровень «О программе» с несколькими страницами CMS внизу. Когда пользователь нажимает на кнопку «О программе», я хочу показать первую дочернюю страницу в меню «О программе» верхнего уровня.

Я могу сделать это, как показано ниже, но это кажется неправильным. Я знаю, что могу сделать статическую переадресацию, но я не хочу этого делать, так как первый дочерний элемент может измениться (в конце концов, это система CMS), и я не хочу, чтобы люди, вводящие данные в CMS, должны были управлять перенаправление. Поэтому я предпочитаю приведенное ниже настроенному перенаправлению.

Это довольно распространенное требование, есть ли стандартный способ сделать это? Я думаю, что смогу сделать это с помощью модификатор навигации, так что я мог бы попробовать этот маршрут следующим.

    <div style="display:none;">{% show_menu 0 1 1 %}</div>
    <div id="topmenu">
      <ul>
      {% for child in children %}
          <li>
          {% if child.children %}
          <a href="{{child.children.0.get_absolute_url}}">
          {% else %}
          <a href="{{child.get_absolute_url}}">
          {% endif %}
          {{ child.get_menu_title }}
          </a>
          </li>
      {% endfor %}
      </ul>
    </div>

Что касается вышеизложенного, мне нужно иметь show_menu, иначе данных для моего пользовательского меню не будет. Есть ли способ, чтобы это не было нужно?

Что мне больше всего не нравится в вышеизложенном, так это то, что страница /about/ все еще активна. Это не самое худшее в мире, если кто-то просматривает там, он получит пустую страницу, но я бы предпочел, чтобы этого не происходило. Думаю, если бы я написал навигационное расширение, то был бы такой же недостаток. Я предполагаю, что мне нужно программное перенаправление для перенаправления на первого ребенка, если эта страница будет поражена. Мысли? Я, вероятно, могу сделать это в логике шаблона, но это кажется безумием.


person Andrew Barrett    schedule 17.02.2012    source источник
comment
Вы нашли решение с модификаторами навигации? Что касается django-cms 3.0, по-прежнему нет хорошего решения, кроме моего небольшого хака, предложенного ниже...   -  person benzkji    schedule 14.10.2014
comment
@benzkji не совсем, чаще всего мы просто устанавливаем перенаправление на страницу верхнего уровня, я думаю, что ваш маленький лайфхак не хуже любого решения   -  person Andrew Barrett    schedule 15.10.2014
comment
хорошо, тогда. мой хак освобождает вас от адаптации значения перенаправления каждый раз, когда изменяется URL-адрес первого дочернего элемента. в зависимости от сценария это может быть реальной выгодой.   -  person benzkji    schedule 16.10.2014


Ответы (2)


2018: обновленная версия, которая работает в cms 3.4+ и совместима с новым стилем промежуточного ПО доступно здесь. После того, как вы добавили /firstchild, вам нужно будет отредактировать/опубликовать страницу перенаправления в списке изменений страниц cms, так как, как вы догадываетесь, это приведет к перенаправлению.


решение с промежуточным программным обеспечением и настраиваемым значением поля перенаправления «/firstchild» для запуска перенаправлений.

  • плюс: у вас не будет пустых страниц
  • плюс: он гибкий, так как позволяет страницы, которые не будут перенаправляться на подстраницы
  • плюс: не требуется никаких действий при изменении URL-адреса первого ребенка
  • мелкий недостаток: всегда есть редирект (301, впрочем, не так уж и плохо ;)
  • Небольшой недостаток: конфигурация немного занудная, так как вам нужно будет ввести «/firstchild» в поле «перенаправление». определенно не удобный для конечного пользователя, но работает. сама cms вообще не предлагает лучшего решения (даже в 2018 году).

from django.shortcuts import redirect

# redirect to first subpage if the "redirect" field is exactly "_subpage"
class RedirectSubpageMiddleware(object):
    def process_view(self, request, view_func, view_args, view_kwargs):
        if request.current_page:
            page = request.current_page
            if "slug" in view_kwargs and page.get_redirect() == "/firstchild":
                subpages = request.current_page.children.all()
                if subpages.count():
                    # can redirect! must make uri!
                    return redirect(subpages[0].get_absolute_url(), permanent=True)
        return None
person benzkji    schedule 07.04.2014
comment
Отличный ответ, я исправил ошибку, из-за которой он всегда перенаправлялся, не позволяя вам опубликовать страницу. - person Kin; 26.09.2014
comment
Любая идея, как сделать это рекурсивным? Я пытался, но он продолжает указывать абсолютный URL, заканчивающийся на /_subpage/ - person Kin; 26.09.2014
comment
спасибо @кин. это промежуточное ПО старше публикации, т.е. 2.4 ;-). page.get_absolute_url всегда будет возвращать правильный путь с URL-адресом, содержащим _subpage/... следует добавить рекурсивную вспомогательную функцию, когда вернетесь из отпуска ;-) - person benzkji; 28.09.2014
comment
@Kin, можете ли вы добавить это исправление к моему ответу, то есть отредактировать его? - person benzkji; 14.10.2014

Вы можете установить CMS_REDIRECTS = True в файле settings.py.

Затем вы можете зайти на страницу /about/ в админке и добавить редирект на /about/child-page

Примечание. На самом деле я этого не пробовал, я случайно наткнулся на эту информацию сегодня утром.

person mcneo    schedule 24.02.2012
comment
Да, это легко, я пробовал, и это работает, но я не хочу иметь какие-то жестко закодированные ссылки, которые люди должны поддерживать. Решения действительно должны перенаправляться к первому дочернему элементу, каким бы он ни был. - person Andrew Barrett; 24.02.2012