如何动态呈现模板以供静态用户选择

时间:2016-10-21 12:44:38

标签: django templates

我不知道如何把这个问题作为标题。但我的问题是我的django项目模板文件夹中的每个视图都有2个模板。一个用于英语的模板和另一个用于西班牙语的模板。我的模板结构是

#include <variant>
#include <string>

int main()
{
    std::variant<int, float> v, w;
    v = 12; // v contains int
    int i = std::get<int>(v);
    w = std::get<int>(v);
    w = std::get<0>(v); // same effect as the previous line
    w = v; // same effect as the previous line

    try {
      std::get<float>(w); // w contains int, not float: will throw
    }
    catch (std::bad_variant_access&) {}

    std::variant<std::string> v("abc"); // converting constructors work when unambiguous
    v = "def"; // converting assignment also works when unambiguous
}

我需要根据用户选择的语言来渲染模板。我现在完全用英语运行该项目。首先,我只将模板转换为西班牙语并准备渲染。对不起,这是一个模糊的问题,但是这方面的一些指示会有所帮助。

我的主要网址是

Project
   |
  app
   |
  templates
     |
    app
      |
   home_en.html
   home_es.html
   about_en.html
   about_es.html

我的app urlpatterns

urlpatterns = [
    url(r'^admin/', admin.site.urls), 
    url(r'^en/', include('app.urls')),
    url(r'^es/', include('app.urls')),
]

我还尝试使用/ en /或/ es /检查请求网址,然后在每个视图中根据它进行渲染。

 urlpatterns = [
        url(r'^about$', views.about, name='about'), 
        url(r'.*', views.home, name='home'), ]

当我明确地将url请求指定为/ en /或/ es /时,这可以正常工作。我如何根据用户选择的语言在网址上设置它?

如果我明确向http://127.0.0.1/es/about发出请求,我的页面会以西班牙语显示,但当我从那里切换到家时,它会返回英文主页。即使我更改了网址,我希望网址保持为/ es /作为开头。现在它变为英语,因为它是模式的上层

2 个答案:

答案 0 :(得分:1)

请阅读Django翻译文档。在这里:https://docs.djangoproject.com/en/1.10/topics/i18n/translation/#module-django.conf.urls.i18n 请参阅部分:网址格式中的语言前缀 在你的urls.py中:

from django.conf.urls.i18n import i18n_patterns

urlpatterns += i18n_patterns (
        url(r'^about$', views.about, name='about'), 
        url(r'.*', views.home, name='home'),
)

这将自动为您的网址添加语言代码。 在views.py中,您可以获取语言代码fomr request.LANGUAGE_CODE,如下所示: from request.LANGUAGE_CODE ==&#39; en&#39;

选择放入html模板的语言:

{% load i18n %}
<form action="{% url 'set_language' %}" method="POST">{% csrf_token %}
    <select name="language" id="language">
        <option value="en">en</option>
        <option value="ru">ru</option>
        <option value="az">az</option>
    </select>
    <button type="submit">send</button>
</form>

{% load i18n %}
<form action="{% url 'set_language' %}" method="post">{% csrf_token %}
    <input name="next" type="hidden" value="{{ redirect_to }}" />
    <select name="language">
    {% get_current_language as LANGUAGE_CODE %}
    {% get_available_languages as LANGUAGES %}
    {% get_language_info_list for LANGUAGES as languages %}
    {% for language in languages %}
    <option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected="selected"{% endif %}>
        {{ language.name_local }} ({{ language.code }})
    </option>
{% endfor %}
    </select>
    <input type="submit" value="Go" />
</form>

答案 1 :(得分:1)

一个非常简单的解决方案是使用带有命名组的单个模式:

url(r'^(?P<language>en|es)/', include('app.urls'))

您的观点必须接受language参数:

def home(request, language):
    # language is either "es" or "en".
    return render(request, 'app/home_{}.html'.format(language), {'title': 'HOME'})

您也可以考虑Django's localization并避免重复视图。