Закрыть

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

Цитата дня

Vivazzi.ru

Личный сайт Мальцева Артема

Вы счастливы или несчастны не благодаря тому, что вы имеете, и не в связи с тем, кем являетесь, где находитесь или что делаете; ваше состояние определяется тем, что вы обо всем этом думаете.

Дейл Карнеги

Перевод тегов в taggit

20 марта 2018 г. 2:12

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

Для перевода используется пакет parler.

Используйте дополнительное поле title. Не добавляйте перевод полю name для django-taggit, так как на поле name завязано много функциональности

from parler.models import TranslatableModel, TranslatedFields
from taggit.managers import TaggableManager from taggit.models import GenericTaggedItemBase, TagBase, ItemBase

class MyTag(TagBase, TranslatableModel):
    translations = TranslatedFields(
        title=models.CharField(_('Title'), max_length=100),
    )

    @permalink
    def get_absolute_url(self):
        return 'tag_page', (self.slug, )

    class Meta:
        ordering = ('name', )
        verbose_name = _('Tag')
        verbose_name_plural = _('Tags')


class MyTaggedItemBase(ItemBase):
    tag = models.ForeignKey(MyTag, related_name='tag_items', on_delete=models.CASCADE)

    class Meta:
        abstract = True

    @classmethod
    def tags_for(cls, model, instance=None, **extra_filters):
        kwargs = extra_filters or {}
        if instance is not None:
            kwargs.update({
                '%s__content_object' % cls.tag_relname(): instance
            })
            return cls.tag_model().objects.filter(**kwargs)
        kwargs.update({
            '%s__content_object__isnull' % cls.tag_relname(): False
        })
        return cls.tag_model().objects.filter(**kwargs).distinct()


class MyTaggedItem(GenericTaggedItemBase, MyTaggedItemBase):
    def get_absolute_url(self):
        if not hasattr(self.content_object, 'get_absolute_url'):
            raise Http404

        return self.content_object.get_absolute_url()

    class Meta:
        verbose_name = _('Tagged Item')
        verbose_name_plural = _('Tagged Items')
        index_together = [
            ['content_type', 'object_id'],
        ]

 

Вывод тегов в шаблоне:

{% load i18n %}

{% with my_object.tags.all as tags %}
    {% if tags %}
        <div class="tags a_i_c">
            <p>
                <a href="{% url 'all_tags' %}" title="{% trans 'Show all tags' %}">{% trans 'Tags' %}</a>:
                {% for tag in tags %}
                    <a href="{% url 'tag_page' tag.slug %}">{{ tag.title }}</a>{% if not forloop.last %}, {% endif %}
                {% endfor %}
            </p>
        </div>
    {% endif %}
{% endwith %}

 

Оцените статью

0 из 5 (всего 0 оценок)

Поля, отмеченные звёздочкой ( * ) , являются обязательными.

Спасибо за ваш отзыв!

Автор статьи

Права на использование данной статьи, расположенной на настоящей странице http://vivazzi.ru/it/translations-for-tags/:

Разрешается копировать статью с указанием её автора и ссылки на оригинал без использования параметра rel="nofollow" в теге <a>. Использование:

Автор статьи: Мальцев Артём
Ссылка на статью: <a href="http://vivazzi.ru/it/translations-for-tags/">http://vivazzi.ru/it/translations-for-tags/</a>

Подробнее: Правила использования сайта

Вам нужно саморазвиваться или вы хотите зарабатывать деньги?

Или вы ищите хорошие IT сервисы или книги? Сохраните свое время и взгляните на мою подборку рекомендаций, которыми постоянно пользуюсь.
Посмотреть рекомендации

Комментариев: 0

Вы можете оставить комментарий как незарегистрированный пользователь. Но, зарегистрировавшись, вы сможете получать оповещения об ответах, а также иметь доступ к своему личному аккаунту для просмотра своих комментариев.

Чтобы оставить комментарий от своего имени войдите или зарегистрируйтесь обычным способом или через социальные сети:

Отправить

На данный момент нет специального поиска, поэтому я предлагаю воспользоваться обычной поисковой системой, например, Google, добавив "vivazzi" после своего запроса.

Попробуйте