Адаптация представлений для переводов

Мы должны адаптировать свои shop views, чтобы использовать переводы QuerySets. Выполните в терминале python manage.py shell и посмотрите, как можно получить поля перевода и запросить их. Чтобы получить содержимое поля для текущего активного языка, нужно просто получить доступ к полю таким же образом, как и к любому полю обычной модели:

>>> from shop.models import Product
>>> product=Product.objects.first()
>>> product.name
'Black tea'

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

>>> product.set_current_language('es')
>>> product.name
'Té negro'
>>> product.get_current_language()
'es'

При выполнении запроса с помощью filter() можно фильтровать использование связанных объектов перевода с помощью синтаксиса translations__ следующим образом:

>>> Product.objects.filter(translations__name='Black tea')
[<Product: Black tea>]

Также можно использовать language() чтобы установить определенный язык для объектов, получаемых следующим образом:

>>> Product.objects.language('es').all()
[<Product: Té negro>, <Product: Té en polvo>, <Product: Té rojo>,
<Product: Té verde>]

Как вы видите, способ доступа к полям и запрос на их перевод довольно прост.

Давайте адаптируем представления каталога продуктов. Измените файл views.py приложения shop и в представлении product_list найдите следующую строку:

category = get_object_or_404(Category, slug=category_slug)

Замените ее на следующий код:

category = get_object_or_404(Category,
                             translations__language=language,
                             translations__slug=category_slug)

Затем измените в представлении product_detail следующую строку:

product = get_object_or_404(Product,
                            id=id,
                            slug=slug,
                            available=True)

На этот код:

product = get_object_or_404(Product,
                            id=id,
                            translations__language_code=language,
                            translations__slug=slug,
                            available=True)

Представления product_list и product_detail теперь адаптированы для извлечения объектов с помощью переводимых полей. Запустите сервер разработки и откройте в браузере http://127.0.0.1:8000/es/ . Вы увидите список продуктов, включая все продукты, переведенные на Испанский язык:

results matching ""

    No results matching ""