Интеграция с django
-------------------

.. py:currentmodule:: pymorphy._morph

Настройка
^^^^^^^^^

1. Добавляем ``'pymorphy'`` в ``INSTALLED_APPS``.

2. Описываем в settings.py установленные словари::

        PYMORPHY_DICTS = {
            'ru': { 'dir': '/usr/share/pymorphy/ru' },
        }

   более сложный пример::

        PYMORPHY_DICTS = {
            'ru': {
                'dir': os.path.join([PROJECT_DIR, 'files', 'dicts']),
                'backend': 'cdb',
                'use_cache': False,
            },
        }

   Параметры:

   * ``dir`` - обязательный параметр, путь до папки с файлами;
   * ``backend`` - используемое key-value хранилище ('sqlite' по умолчанию);
   * ``use_cache`` - использовать ли кэш (True по умолчанию).

Получение экземпляра анализатора для ручного использования
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

В случае, когда настроена интеграция pymorphy с django,
экземпляр анализатора следует получать следующим образом::

    from pymorphy.django_conf import default_morph as morph

Не стоит получать экземпляр анализатора через
:meth:`pymorphy.get_morph <get_morph>` во вьюхах (или еще где-то на каждый
запрос) - это приведет к утечке ресурсов.

Шаблонные фильтры
^^^^^^^^^^^^^^^^^

Фильтры подключаются следующей командой:

.. code-block:: django

    {% load pymorphy_tags %}

.. _inflect-filter:

inflect
#######

Меняет грамматическую форму каждого слова на указанную в параметрах.
Про доступные параметры можно почитать :ref:`тут (см. "Полный формат") <parameter-format>`.

Пример:

.. code-block:: django

   {# в переменной city "Нижний Новгород" #}

   {% load pymorphy_tags %}
   Мы начали работу в {{ city|inflect:"пр" }}!

   {# выведет "Мы начали работу в Нижнем Новгороде!" #}


Пример с несклоняемой частью

.. code-block:: django

   {% load pymorphy_tags %}

   Не осталось у нас {{ "лошадь [[Пржевальского]]"|inflect:"рд,мн" }}.

   {# выведет "Не осталось у нас лошадей Пржевальского" #}

.. _inflect_marked-filter:

inflect_marked
##############

Идентичен фильтру inflect за исключением того, что противоположным образом
трактует [[ ]]

.. code-block:: django

   {% load pymorphy_tags %}
   Не осталось у нас {{ "[[лошадь]] Пржевальского"|inflect_marked:"рд,мн" }}.

   {# выведет "Не осталось у нас лошадей Пржевальского" #}

.. _plural-filter:

plural
######

Ставит слово в форму, которая согласуется с заданным числом (1 попугай,
2 попугая, 5 попугаев).

.. code-block:: django

   {% load pymorphy_tags %}

   {# в переменной num число попугаев (пусть = 38) #}
   На дереве {{ num }} {{ "попугай"|plural:num }}.
   {# выведет "На дереве 38 попугаев." #}

   {# в переменной animal - "лошадь" #}
   А еще есть {{ num }} {{ animal|plural:num }}.
   {# выведет "А еще есть 38 лошадей." #}

Фильтры :ref:`inflect-filter` и :ref:`plural-filter` не склоняют все,
что заключено в двойные квадратные скобки. Фильтр :ref:`inflect_marked-filter`
- наоборот, работает только с тем, что в двойных квадратных скобках.

Можно указать другие разделители (обязательно 2х-символьные),
определив в settings.py переменные ``PYMORPHY_MARKER_OPEN`` и
``PYMORPHY_MARKER_CLOSE``.

.. note::

   Фильтры из pymorphy_tags стараются сохранить написание больших-маленьких
   букв (обрабатываются варианты "ВСЕ СЛОВО БОЛЬШИМИ", "С заглавной",
   "все маленькими").

   Если по какой-то причине смена формы не удалась, возвращают исходную строку.

.. warning::

    Фильтры в настоящий момент могут плохо работать с именами и фамилиями.
