django-cms перенаправляет меню верхнего уровня первому ребенку - PullRequest
2 голосов
/ 18 февраля 2012

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

Я могу сделать это, как показано ниже, но это неправильно. Я знаю, что могу сделать статическое перенаправление, но я не хочу этого делать, так как может измениться первый ребенок (в конце концов, это система 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 / все еще активна. Это не самая плохая вещь в мире, если кто-то заходит туда, он получит пустую страницу, но я бы предпочел, чтобы этого не произошло. Я думаю, если бы я написал расширение для навигации, тот же недостаток был бы там. Я предполагаю, что мне нужен программный редирект для перенаправления на первый дочерний элемент, если эта страница нажата. Мысли? Я, вероятно, могу сделать это в логике шаблона, но это кажется сумасшедшим.

Ответы [ 2 ]

3 голосов
/ 07 апреля 2014

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


решение с промежуточным программным обеспечением и настраиваемым значением поля перенаправления "/ firstchild", чтобы инициировать перенаправления.

  • плюс: у вас не будет пустых страниц
  • плюс: он гибкий, так как допускает страницы, которые не будут перенаправлены на подстраницы
  • плюс: никаких действий не требуется при изменении URL первого ребенка
  • незначительный недостаток: всегда есть перенаправление (301, хотя, не так уж и плохо;)
  • незначительный недостаток: конфигурация немного сложная, так как вам нужно будет ввести "/ firstchild" в поле "redirect". определенно не удобный для пользователя, но работает. Сам по себе 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
3 голосов
/ 24 февраля 2012

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

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

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

...