Wagtail: пункт меню открывается в новом окне, но добавляет основной домен к внешнему URL-адресу? - PullRequest
0 голосов
/ 30 мая 2020

Я создаю меню с помощью снайперов.

Пункты меню могут иметь внутреннюю страницу в качестве назначения или внешнюю страницу (например, google.com).

Внутренняя опция работает отлично, но внешняя опция открывается в новый тег с именем хоста, прикрепленным к внешней ссылке:

http://127.0.0.1:8000/google.com

Не уверен, что что-то не так с моей моделью Orderable или что происходит.

Код :

class MenuItem(Orderable):

    link_title = models.CharField(
        blank=True,
        null=True,
        max_length=50
    )
    link_url = models.CharField(
        max_length=500,
        blank=True,
    )
    link_page = models.ForeignKey(
        "wagtailcore.Page", #app y modelo de tu proyecto
        blank=True, 
        null=True,
        related_name="+",
        on_delete=models.CASCADE,
    )
    open_in_new_tab = models.BooleanField(default=False, blank=True,)

    page = ParentalKey("Menu", related_name="menu_items")

    panels = [
        FieldPanel("link_title"),
        FieldPanel("link_url"),
        PageChooserPanel("link_page"),
        FieldPanel("open_in_new_tab"),
    ]

    # @tood add properties 
    # link
    @property
    def link(self):
        if self.link_page:
            return self.link_page.url
        elif self.link_url:
            return self.link_url
        return "#"

    @property
    def title(self):
        if self.link_page and not self.link_title:
            return self.link_page.title
        elif self.link_title:
            return self.link_title
        return 'Missing title'

@register_snippet
class Menu(ClusterableModel):

    title = models.CharField(max_length=100)
    slug = AutoSlugField(populate_from="title", editable=True)

    panels = [
        MultiFieldPanel([
            FieldPanel("title"),
            FieldPanel("slug")
        ], heading="Menu"),
        InlinePanel("menu_items", label="Menu item")
    ]

    def __str__(self):
        return self.title

html:

<div class="collapse navbar-collapse" id="navbarCollapse">
        <ul>
            <li>
                <a href="/">Home</a>
            </li>
            {% for item in navigation.menu_items.all %}
                <li>
                    <a href="{{ item.link }}" class="nav-link" {% if item.open_in_new_tab %} target="_blank" {% endif %}>{{ item.title }}</a>
                </li>
            {% endfor %}
        </ul>
        <form class="form-inline ml-auto">
            <a href="" class="btn btn-outline-secondary">Ingresar</a>
            <a href="" class="btn btn-primary ml-2">Registro</a>
        </form>
    </div>

Нашел этот другой вопрос, но он отличается от моего подхода:

Открытие внешних ссылок в новом окне в трясогузке

Скриншот:

enter image description here

1 Ответ

2 голосов
/ 30 мая 2020

Ваш код мне кажется прекрасным. Просто вы неправильно ввели свой URL. Вам нужно будет добавить часть http(s)://, чтобы ссылка фактически указывала на https://google.com вместо http://127.0.0.1:8000/google.com.

Кроме того, я рекомендую изменить link_url с CharField на * URLField, например:

class MenuItem(Orderable):

    # ...

    link_url = models.URLField(
        max_length=500,
        blank=True,
    )

Причина в том, что, хотя эти два поля идентичны, URLField имеет встроенный лог c (т. Е. validator ), который проверяет правильность шаблона URL. Поэтому, когда вы вводите неверный URL-адрес в админке, например google.com без https://, ваше меню не сохраняется. Не забудьте запустить manage.py makemigrations и manage.py migrate после замены поля.

...