This is a very basic question. I tried to google to find answers that I could understand in simple language. but that did not help. I came across the below snippet of code in Django's UserCreationForm
and only then I know something ugettext_lazy
_
exists. I have no idea, if it is a django specific module/function
, what's its purpose and why it should be used.
There is this article in SO, which discuss more on this. but I want to grasp the fundamentals first. Please enlighten me!
from django.utils.translation import ugettext, ugettext_lazy as _
///// what is the _ means here and why is it used
class UserCreationForm(forms.ModelForm):
"""
A form that creates a user, with no privileges, from the given username and
password.
"""
error_messages = {
'duplicate_username': _("A user with that username already exists."),
'password_mismatch': _("The two password fields didn't match."),
}
gettext_lazy() In definitions like forms or models you should use gettext_lazy because the code of this definitions is only executed once (mostly on django's startup); gettext_lazy translates the strings in a lazy fashion, which means, eg.
ugettext is a unicode version of a translatable string.
ugettext_lazy is a "lazy" version of that. Lazy strings are a Django-ism; they are string-like objects that don't actually turn into the real string until the last possible minute. Often, you can't know how to translate a string until late in the process. I don't know what language a browser uses until I can look at their request, so I want the translation string to be "lazy" and not evaluate until it absolutely needs to be rendered in the template, for instance.
For your purpose, it means these will appear as strings--but it also means that they might be overridden by translations. So, for example, you could change the duplicate-username message to _("Sorry, but a user with that name exists. Please try again")
. For English-speaking browsers, they'd see your new message. If this string has a translation already registered, though, you'd be breaking it--now the lookup for the Spanish-language version would fail, since it wouldn't find a matching string to yours for Spanish.
For 95% of sites, this doesn't matter, since you won't offer a translated version of your site. If it does, you should read https://docs.djangoproject.com/en/dev/topics/i18n/.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With