Работает ли тег wagtail {% slugurl 'page' %} с Wagtail-localize?
Я создаю сайт с помощью Django, Wagtail и Wagtail Localize.
Но когда я загружаю свой сайт на "https://exemple.com/fr/" теги slugurl генерируют ссылки типа href="/en/about/"
Я следовал настройкам для urls.py :
urlpatterns = urlpatterns + i18n_patterns(
path("search/", search_views.search, name="search"),
path("", include(wagtail_urls)),
)
Я также добавил промежуточное ПО и другие настройки, такие как LANGUAGES. Страницы корректно переведены и доступны по урлам.
Код языка определен, потому что тег типа {% if LANGUAGE_CODE == "fr" %} работает, но этот slugurl никогда не работает и всегда отображает "/en/about/" :
<a href="{% slugurl 'about' %}" class="nav-links">about</a>
Навигация не очень плавная, потому что при переходе на страницу приходится каждый раз заново выбирать язык. Должен ли slugurl работать с Wagtail-localize?
slugurl
всегда будет возвращать только первую страницу, соответствующую слогу - этот слог может также повторяться в каждой локали, поэтому здесь нужна некоторая осторожность.
Я использую пользовательский templatetag, чтобы вернуть локализованную страницу для первого совпадения:
@register.simple_tag()
def trans_page_from_slug(slug, specific=False):
try:
if specific:
return Page.objects.live().filter(slug=slug).first().specific.localized
else:
return Page.objects.live().filter(slug=slug).first().localized
except:
return Page.objects.none()
Таким образом, даже если на вашем французском языке slug страницы будет что-то вроде 'a-propos', templatetag вернет правильную переведенную страницу для slug 'about'.
Полагаю, если вы хотите вернуть только url, вы можете использовать:
@register.filter()
def localised_slugurl(slug):
try:
return Page.objects.live().filter(slug=slug).first().localized.url
except:
return ''
Тогда ваша навигационная ссылка будет выглядеть так:
<a href="{{ 'about'|localised_slugurl }}" class="nav-links">about</a>
Однако это не изменит ваш ярлык 'about'. Для этого можно использовать тег шаблона trans_page_from_slug
, чтобы вернуть страницу, а затем обратиться к атрибутам url и title в вашей ссылке:
{% trans_page_from_slug "about" as link %}
<a href="{{ link.url }}" class="nav-links">{{ link.title }}</a>
Если заголовки ваших страниц слишком длинные для навигационного меню, добавьте необязательное поле menu_title
к моделям страниц и используйте его там, где это необходимо. По умолчанию используется значение title, так что у вас всегда будет значение:
{{ link.menu_title|default:link.title }}
Убедитесь, что вы возвращаете specific
страницу из templatetag, если вы делаете это, так как базовая модель Page не будет включать ваше пользовательское поле.