【问题标题】:Set language of template in Django by clicking on <a> link from Bootstrap Dropdown menu通过单击 Bootstrap 下拉菜单中的 <a> 链接在 Django 中设置模板语言
【发布时间】:2015-07-04 12:31:25
【问题描述】:

在 Django 的文档中有一个example,它显示了用户如何选择页面的语言。他们填写然后提交表格。

这个例子对我有用。但是,我想使用带有链接列表的Bootstrap dropdown 来导致这种行为。我有想法将“下一个”输入的值设置为所选语言的代码并提交表单。代码如下:

<form name="ui" action="{% url 'set_language' %}" method="post">{% csrf_token %}
    <input name="next" type="hidden" value="{{ redirect_to }}" />
    <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
    {% get_current_language as LANGUAGE_CODE %}
    {% get_language_info for LANGUAGE_CODE as lang %}
    {% get_available_languages as LANGUAGES %}
    {% get_language_info_list for LANGUAGES as languages %}
    {{ lang.name_local }}
    <span class="caret"></span>
    </a>
    <ul class="dropdown-menu">
    {% for language in languages %}
        <li><a href="#" onclick="document.ui.next.value='{{ language.code}}'; document.ui.submit();">{{ language.name_local }}</a></li>                                                                    
    {% endfor %}
    </ul>
</form>

它生成以下 html 代码(我省略了 csrf 令牌,但它在那里):

<form name="ui" action="/i18n/setlang/" method="post">
    <input name="next" type="hidden" value="" />
    <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">English<span class="caret"></span></a>
                <ul class="dropdown-menu">
                    <li><a href="#" onclick="document.ui.next.value='en'; document.ui.submit();">English</a></li>
                    <li><a href="#" onclick="document.uiLang.next.value='de'; document.uiLang.submit();">German</a>
                    </li>
                </ul>
</form>

这会导致(选择带有“de”语言代码的德语),但是,请求 URL http://127.0.0.1:8000/i18n/setlang/de 的 404 错误(并且,不知道为什么,使用请求方法“GET”)。

出了什么问题,我该如何解决?

附言线

url(r'^i18n/', include('django.conf.urls.i18n')),

在 urls.py 中有没有

【问题讨论】:

    标签: python django twitter-bootstrap


    【解决方案1】:

    你可以试试这个更简单的:

    {% load i18n %}
    {% get_available_languages as languages %}
    
    {% for language in languages %}
        <li class="{% ifequal current_language language.0 %}active{% endifequal %}">
            <a href="/./{{ language.0 }}/" title="{{ language.1 }}">
                {{ language.1 }}
            </a>
        </li>
    {% endfor %}
    

    【讨论】:

    • 如何定义{{ lang }}?
    • 什么是current_language? {% get_current_language as current_language %},对吧?
    • 我可能错过了一些东西,但我没有看到变量“current_language”出现,只有“get_current_language”。您在块 {% ifequal current_language language.0 %} 中使用它
    • 我找到了适合我的解决方案并将其发布为答案。您的解决方案对我不起作用,可能取决于其他设置。无论如何,感谢您的合作,它让我想到了其他想法,因此,我对此表示赞同。
    【解决方案2】:

    这对我有用:添加一个名为“语言”的额外输入元素

    另外,在提交表单之前在JS中为其分配一个语言代码,即document..language.value =

    那么模板部分是这样的:

    <form name="ui" action="{% url 'set_language' %}" method="post">{% csrf_token %}
    <input name="next" type="hidden" value="{{ redirect_to }}" />
    <input name="language" type="hidden"/>
    <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
    {% get_current_language as LANGUAGE_CODE %}
    {% get_language_info for LANGUAGE_CODE as lang %}
    {% get_available_languages as LANGUAGES %}
    {% get_language_info_list for LANGUAGES as languages %}
    {{ lang.name_local }}
    <span class="caret"></span>
    </a>
    <ul class="dropdown-menu">
    {% for language in languages %}
        <li><a href="#" onclick="document.ui.language.value='{{ language.code}}'; document.ui.submit();">{{ language.name_local }}</a></li>                                                                    
    {% endfor %}
    </ul>
    

    【讨论】:

      猜你喜欢
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      相关资源
      最近更新 更多