Caveats¶
Consider the following example (assuming the default language is de
):
>>> n = News.objects.create(title="foo")
>>> n.title
'foo'
>>> n.title_de
>>>
Because the original field title
was specified in the constructor it is
directly passed into the instance’s __dict__
and the descriptor which
normally updates the associated default translation field (title_de
) is not
called. Therefor the call to n.title_de
returns an empty value.
Now assign the title, which triggers the descriptor and the default translation field is updated:
>>> n.title = 'foo'
>>> n.title_de
'foo'
>>>
Accessing Translated Fields Outside Views¶
Since the modeltranslation mechanism relies on the current language as it
is returned by the get_language
function care must be taken when accessing
translated fields outside a view function.
Within a view function the language is set by Django based on a flexible model described at How Django discovers language preference which is normally used only by Django’s static translation system.
When a translated field is accessed in a view function or in a template, it
uses the django.utils.translation.get_language
function to determine the
current language and return the appropriate value.
Outside a view (or a template), i.e. in normal Python code, a call to the
get_language
function still returns a value, but it might not what you
expect. Since no request is involved, Django’s machinery for discovering the
user’s preferred language is not activated.
Todo
Explain more
The unittests in tests.py
use the django.utils.translation.trans_real
functions to activate and deactive a specific language outside a view function.