1. andrexus

    14.03.2010

    0 ↑
    0 ↓
    Доброго всем времени суток!
    Не могу найти причину следующей проблемы:
    я использую 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 }}
  2. А код формы можно?
  3. andrexus

    14.03.2010

    0 ↑
    0 ↓
    Конечно можно. Самая простая форма:
    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)
  4. label = _('First name:'),

    А "_" у вас как определено?

  5. "_" - не ugettext_lazy?
  6. andrexus

    14.03.2010

    0 ↑
    0 ↓
    from django.utils.translation import ugettext as _
  7. from django.utils.translation import ugettext as _

    Вы должны использовать ленивые gettext обертки (ugettext_lazy), чтобы динамически переключался перевод для таких элементов как лейблы моделей и форм, объявленных в модулях.

  8. andrexus

    14.03.2010

    0 ↑
    0 ↓
    Спасибо! Работает.
    Когда читал документацию, не обратил на это внимания. Мне надо быть повнимательнее к таким нюансам.
  9. andrexus

    14.03.2010

    0 ↑
    0 ↓
    А почему не работает перевод если использовать следующую конструкцию:
    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)
  10. Суть ленивых функций в том, что они возвращают объект, который только в момент непосредственного использования строки (например вывод в шаблоне) пытается найти перевод для заданной строки. Вы же этим кодом

     required_str = u' <span title="%s">*</span>'
                                     % _('This field is required')
    

    форсируете преобразование к строке ещё на этапе импорта модуля, который происходит один раз при старте сервера и поэтому никак не может реагировать на последующие изменения языка.

  11. andrexus

    14.03.2010

    0 ↑
    0 ↓
    И как можно решить эту проблему?
    label = mark_safe(_('Username:')
    применяя mark_safe перестает правильно работать. Есть ли какой-нибудь workaround?
  12. Иван Сагалаев

    14.03.2010

    0 ↑
    0 ↓

    Вы используете сообщение об ошибке очень сранным образом: пытаетесь им помечать поля, вместо того, чтобы выводить как текст. Отсюда и все неудобства. Можно просто сделать как везде: помечать поля звёздочками не в рамках вывода сообщений об ошибке, а явно в шаблоне рядом с полями. Тогда и mark_safe вокруг них не понадобится.

  13. andrexus

    14.03.2010

    0 ↑
    0 ↓
    Дело в том, что это не сообщение об ошибке, а текст label-a
    т.е. в итоге должно получиться следующее:
    <label for="id_username">Имя пользователя:
    <span title="Это обязательное поле" class="form-required">*</span>
    </label>
  14. Иван Сагалаев

    14.03.2010

    0 ↑
    0 ↓

    Ай, да, я попутал... Но на самом деле, суть всё та же. Вместо:

    <div>{{ form.username }}</div>
    

    Вы выводите что-то вроде:

    <div>
        {% if form.username.is_required %}<span>*</span>{% endif %}
        {{ form.username }}
    </div>
    
  15. andrexus

    14.03.2010

    0 ↑
    1 ↓
    Я вывожу форму след. образом:
    {% 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 %}
    В таком случае нет необходимости проверять обязательно ли поле.
    Поэтому хотелось бы иметь
    <span title="Это обязательное поле" class="form-required">*</span>
    непосредственно в label-e

    Кончно совсем не обязательно именно таким образом формировать label. Но тем не менее вопрос остается открытым.
  16. Иван Сагалаев

    14.03.2010

    1 ↑
    0 ↓

    Автоматический вид label-тега не подходит под ваше желание. Именно потому, что там не ожидается наличия HTML-оформления. Обходить это тем способом, каким вы хотите (mark_safe) пртивоестественно и неудобно :-).

    Проще всего сделать наверное так. Вместо:

    {{ field.label_tag }}
    

    Сделать явно:

    <label for="id_{{ field.name }}">{{ field.label }} <span ... >*</span></label>
    

    То есть вмешаться в отображение label-тега не на уровне текста label'а, а на уровне шаблона.

  17. andrexus

    15.03.2010

    0 ↑
    0 ↓
    Именно потому, что там не ожидается наличия HTML-оформления.
    Не очень приятное ограничение (:
    Обходить это тем способом, каким вы хотите (mark_safe) пртивоестественно и неудобно :-)
    Да, я с вами согласен. Спасибо за совет

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.