Работает ли тег 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 не будет включать ваше пользовательское поле.

Вернуться на верх