1. Mikhail Korobov
  2. pymorphy
  3. Issues
Issue #33 resolved

Баг в шаблонных фильтрах

Anonymous created an issue

пробую использовать в шаблонах django следующий кусок кода:

{{{ {{ 'лошадь'|inflect:'дт' }} }}}

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

{{{ return _process_unmarked_phrase(unicode(phrase), default_morph.inflect_ru, form) }}}

здесь я вижу конвертацию исходной фразы в юникод. однако, строковое значение формы остаётся неизменным. если верить отладчику, из шаблонов django переменные поступают в виде SafeUnicode. в результате чего имеем exception {{{ {TypeError} Argument 'form_string' has incorrect type (expected unicode, got SafeUnicode) }}} в функции _process_phrase. данный эксепшн там ловится и возвращается исходная фраза.

вылечил обёрткой в unicode() в фильтрах inflect. inflect_marked, plural: {{{ return process***_phrase(unicode(phrase), default_morph.inflect_ru, unicode(form)) return _process_unmarked_phrase(unicode(phrase), default_morph.pluralize_inflected_ru, unicode(amount)) }}}

Comments (5)

  1. Anonymous

    ошибочка. в plural аргумент amount в unicode оборачивать не нужно

    return _process_unmarked_phrase(unicode(phrase), default_morph.pluralize_inflected_ru, amount)
    
  2. Mikhail Korobov repo owner

    Тут хитрость, похоже, в том, что баг проявляется только с pymorphy_speedups (без него вот эти тесты проходят, а с ним - падают):

    class LazyStringTest(TestCase):
    
        def test_safe_string(self):
            tpl = template.Template("{% load pymorphy_tags %}{{ 'конь'|inflect:'дт' }}")
            rendered, expected = tpl.render(template.Context()), u'коню'
            assert rendered == expected, (u'%s != %s' % (rendered, expected)).encode('utf8')
    
        def test_i18n_string(self):
            horse = _(u'конь')
            tpl = template.Template("{% load pymorphy_tags %}{{ horses|inflect:'дт' }}")
            rendered, expected = tpl.render(template.Context({'horses': horse})), u'коню'
            assert rendered == expected, (u'%s != %s' % (rendered, expected)).encode('utf8')
    
    
  3. Log in to comment