Я создаю меню с помощью снайперов.
Пункты меню могут иметь внутреннюю страницу в качестве назначения или внешнюю страницу (например, 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>
Нашел этот другой вопрос, но он отличается от моего подхода:
Открытие внешних ссылок в новом окне в трясогузке
Скриншот: