代码之家  ›  专栏  ›  技术社区  ›  Thomas

Django translate引用了错误的URL

  •  2
  • Thomas  · 技术社区  · 6 年前

    我正在我的一个项目中使用Django(版本2.1.3),目前正在与一个奇怪的bug斗争。我使用内置国际化模块,并在我的主菜单中包含了一个语言切换程序,它加载到每个页面上

    {% 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\u 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
    

    *****编辑*****

    我的网址.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)
    

    答案网址.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。为什么我的网址会被修改?

    0 回复  |  直到 6 年前