-
Доброго всем времени суток!
Не могу найти причину следующей проблемы:
я использую localeurl для отображения сайта на разных языках.
Таким образом я меняю язык:
но при этом не происходит смена языка эелементов формы. Язык меняется только после перезапуска сервера.{% for lang in LANGUAGES %}
{% ifequal lang.0 LANGUAGE_CODE %}
<li class="selected">{{ lang.0 }}</li>
{% else %}
<li><a href="{{ request.path|chlocale:lang.0 }}">{{ lang.0 }}</a></li>
{% endifequal %}
{% endfor %}
форму вывожу следующим образом:{{ ProfileForm.as_p }} -
А код формы можно?
-
Конечно можно. Самая простая форма:
class MyForm(forms.Form):
first_name = forms.CharField(label = _('First name:'), help_text = _('Please enter your first name'), max_length = 30)
last_name = forms.CharField(label = _('Last name:'), help_text = _('Please enter your last name'), max_length = 30)
middle_name = forms.CharField(label = _('Middle name:'), help_text = _('Please enter your middle name'), max_length = 30, required = False) -
label = _('First name:'),
А "
_" у вас как определено? -
"_" - не ugettext_lazy?
-
from django.utils.translation import ugettext as _
-
from django.utils.translation import ugettext as _
Вы должны использовать ленивые gettext обертки (
ugettext_lazy), чтобы динамически переключался перевод для таких элементов как лейблы моделей и форм, объявленных в модулях. -
Спасибо! Работает.
Когда читал документацию, не обратил на это внимания. Мне надо быть повнимательнее к таким нюансам. -
А почему не работает перевод если использовать следующую конструкцию:
from django.utils.translation import ugettext_lazy as _
from django.utils.safestring import mark_safe
required_str = u' <span title="%s">*</span>' % _('This field is required')
label = mark_safe(_('Username:') + required_str) -
Суть ленивых функций в том, что они возвращают объект, который только в момент непосредственного использования строки (например вывод в шаблоне) пытается найти перевод для заданной строки. Вы же этим кодом
required_str = u' <span title="%s">*</span>' % _('This field is required')форсируете преобразование к строке ещё на этапе импорта модуля, который происходит один раз при старте сервера и поэтому никак не может реагировать на последующие изменения языка.
-
И как можно решить эту проблему?
применяя mark_safe перестает правильно работать. Есть ли какой-нибудь workaround?label = mark_safe(_('Username:') -
Вы используете сообщение об ошибке очень сранным образом: пытаетесь им помечать поля, вместо того, чтобы выводить как текст. Отсюда и все неудобства. Можно просто сделать как везде: помечать поля звёздочками не в рамках вывода сообщений об ошибке, а явно в шаблоне рядом с полями. Тогда и
mark_safeвокруг них не понадобится. -
Дело в том, что это не сообщение об ошибке, а текст label-a
т.е. в итоге должно получиться следующее:<label for="id_username">Имя пользователя:
<span title="Это обязательное поле" class="form-required">*</span>
</label> -
Ай, да, я попутал... Но на самом деле, суть всё та же. Вместо:
<div>{{ form.username }}</div>Вы выводите что-то вроде:
<div> {% if form.username.is_required %}<span>*</span>{% endif %} {{ form.username }} </div> -
Я вывожу форму след. образом:
В таком случае нет необходимости проверять обязательно ли поле.{% for field in form %}
<div class="form-item">
{{ field.label_tag }}
{{ field }}
{% if field.help_text %}
<div class="description">{{ field.help_text }}</div>
{% endif %}
{% if field.errors %}
<div class="myerrors clearfix">{{ field.errors }}</div>
{% endif %}
</div>
{% endfor %}
Поэтому хотелось бы иметь
непосредственно в label-e<span title="Это обязательное поле" class="form-required">*</span>
Кончно совсем не обязательно именно таким образом формировать label. Но тем не менее вопрос остается открытым. -
Автоматический вид label-тега не подходит под ваше желание. Именно потому, что там не ожидается наличия HTML-оформления. Обходить это тем способом, каким вы хотите (
mark_safe) пртивоестественно и неудобно :-).Проще всего сделать наверное так. Вместо:
{{ field.label_tag }}Сделать явно:
<label for="id_{{ field.name }}">{{ field.label }} <span ... >*</span></label>То есть вмешаться в отображение label-тега не на уровне текста label'а, а на уровне шаблона.
-
Именно потому, что там не ожидается наличия HTML-оформления.Не очень приятное ограничение (:
Да, я с вами согласен. Спасибо за советОбходить это тем способом, каким вы хотите (mark_safe) пртивоестественно и неудобно :-)
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.



