Адаптация представлений для переводов
Мы должны адаптировать свои 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/ . Вы увидите список продуктов, включая все продукты, переведенные на Испанский язык: