Джанго переводчик ссылается на неправильный URL - PullRequest
0 голосов
/ 15 ноября 2018

Я использую Django (версия 2.1.3) в одном из моих проектов и в настоящее время борюсь со странной ошибкой.Я использую модуль интернационализации сборки и включил переключатель языка в свое главное меню, которое загружается на каждой странице

{% get_current_language as LANGUAGE_CODE %}
<form id="form" action="{% url 'set_language' %}" method="post">
     {% csrf_token %}
     <input name="next" type="hidden" value="{{ request.get_full_path|strip_lang }}" />
     <input id="form_lang" name="language" type="hidden" value="{{ LANGUAGE_CODE }}"/>
</form>
<ul role="menu" class="dropdown-menu"id="lang-dropdown">
{% get_available_languages as LANGUAGES %}
{% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %}
     <li>
          <a href="#" onClick='(function(){                                              
               document.getElementById("form_lang").value = "{{ language.code }}";                                                    
               document.getElementById("form").submit(); return false;})();return false;'>
          {{ language.name_local }} ({{ language.code }})</a>
     </li>
{% endfor %}
</ul>

Я создал специальный тег "strip_lang" для удаления идентификатора языка из текущего URL.

@register.filter
@stringfilter
def strip_lang(value):
    """Removes all values of arg from the given string"""
    lang = getattr(settings, "LANGUAGES", None)
    url = value.split('/')
    if url[1] in [l[0] for l in lang]:
        return urllib.parse.unquote('/' + '/'.join(value.split('/')[2:]))
    else:
        return urllib.parse.unquote(value)

Все это хорошо работает.Однако для одного из моих приложений меня всегда перенаправляют в другое приложение.то есть если я нахожусь на пути

 /en/app1/mypage1 

и переключаю язык, на котором я внезапно оказываюсь в

 /fr/app2/mypage1

***** РЕДАКТИРОВАТЬ *****

Рефералы для app2 работают правильно.При ручном вводе URL-адреса для app1 страницы загружаются корректно.

Мой url.py в основном проекте выглядит следующим образом

urlpatterns = [
    path('admin/', admin.site.urls),
    path('i18n/', include('django.conf.urls.i18n')),
    ]
urlpatterns += i18n_patterns(
    path('app1/', include('app1.urls')),
    path('app2/', include('app2.urls')),
    path('app3/', include('app3.urls')),
    url(r'^$', TemplateView.as_view(template_name='home.html'), name='home'),
    url(r'^login/$', auth_views.LoginView.as_view(), {'template_name': 'login.html'}, name='login'),
    url(r'^logout/$', auth_views.LogoutView.as_view(), {'template_name': 'logged_out.html'}, name='logout'),
    url(r'^oauth/', include('social_django.urls', namespace='social')),
prefix_default_language=False)

и urls.py моих приложений выглядят так

urlpatterns = [
    path('', views.index, name='index'),
    path('surveys/', views.nrgt_surveys, name='nrgt_surveys'),
    path('surveys/<str:survey_name>/', views.survey, name='survey'),
    path('surveys/<str:survey_name>/<query_name>', views.survey_query, name='survey_query'),
    path('landscapes/', views.landscapes, name='landscapes'),
    path('landscapes/<str:landscape_name>/', views.landscape, name='landscape'),
    path('landscapes/<str:landscape_name>/<query_name>', views.landscape_query, name='landscape_query'),
]

Я не указываю имя приложения в моем коде.Когда я отслеживаю свои сетевые запросы, я также вижу, что правильный запрос отправляется в запросе POST.Почему мой URL изменяется?

...