Skip to main content

django-hvad package coverage build

Model translations made easy.

This project adds support for model translations in Django. It is designed to be unobtrusive, efficient and reliable. On the technical side, it uses an automatically created Translations Model to store translatable fields in arbitrary languages with a foreign key to the main model, enabling fast queries.

Started in 2011, hvad has grown mature and is now used on large scale applications.

Quick links:

Features

  • Simple - only 3 new queryset methods.

  • Natural - use Django ORM as usual, it just became language aware.

  • Fast - no additional queries for reads, just an inner join to an indexed key.

  • Complete - relationships, custom managers and querysets, proxy models, and abstract models.

  • Batteries included - translation-enabled forms and admin are provided.

  • Reliable - more than 300 test cases and counting. coverage build

  • Compatible - follows Django compatibility matrix.

Django-hvad also features support for Django REST framework 3.1 or newer, including translation-aware serializers.

Example Uses

Declaring a translatable Book model:

class Book(TranslatableModel):
    author = models.ForeignKey(Author)
    release = models.Date()

    translations = TranslatedFields(
        title = models.CharField(max_length=250)
    )

Thus, only the title will vary based on the language. Release date and author are shared among all languages. Let’s now create a Book instance:

# The recommended way:
book = Book.objects.language('en').create(
    author = Author.objects.get(name='Antoine de Saint Exupéry'),
    release = datetime.date(1943, 4, 6),
    title = "The Little Prince",
)

# Also works
book = Book(language_code='en')
book.author = Author.objects.get(name='Antoine de Saint Exupéry')
book.release = datetime.date(1943, 4, 6)
book.title = "The Little Prince"
book.save()

Providing some translations:

book.translate('fr')
book.title = "Le Petit Prince"
book.save()
book.translate('de')
book.title = "Der kleine Prinz"
book.save()

Every call to translate() creates a new translation from scratch and switches to that translation; save() only saves the latest translation. Let’s now perform some language-aware queries:

Book.objects.all()

Compatible by default: returns all objects, without any translated fields attached. Starting from v1.0, default behavior can be overriden to work like next query:

Book.objects.language().all()

Returns all objects as translated instances, but only the ones that are translated into the currect language. You can also specify which language to get, using e.g.:

Book.objects.language("en").all()

Usual queryset methods work like they always did: let’s get all books as translated instances, filtering on the title attribute, returning those that have Petit Prince in their French title, ordered by publication date (in their French edition):

Book.objects.language("fr").filter(title__contains='Petit Prince').order_by('release')

Other random examples:

# last German book published in year 1948
Book.objects.language("de").filter(release__year=1948).latest()

# other books from the same author as mybook. Cache author as well.
Book.objects.language().select_related('author').filter(author__books=mybook)

# books that have "Django" in their title, regardless of the language
Book.objects.language('all').filter(title__icontains='Django')

More examples in the quickstart guide.

Releases

Django-hvad uses the same release pattern as Django. The following versions are thus available:

  • Legacy branch 1.8, available through PyPI and git branch releases/1.8.x.

  • Stable branch 2.0, available through PyPI and git branch releases/2.0.x.

  • Development branch 2.1, available through git branch master.

Stable branches have minor bugfix releases as needed, with guaranteed compatibility. See the installation guide for details, or have a look at the release notes.

Thanks to

Jonas Obrist (https://github.com/ojii) for making django-nani and for helping me with this project.

Kristian Øllegaard (https://github.com/KristianOellegaard/) for django-hvad and trusting me to continue the development.

Metadata

Release files for lotrek-django-hvad 2.0.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for lotrek-django-hvad 2.0.7
File Size Uploaded Provenance
lotrek-django-hvad-2.0.7.tar.gz 108.9 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for lotrek-django-hvad 2.0.7
File Interpreter ABI Platform
lotrek_django_hvad-2.0.7-py2.py3-none-any.whl Python 2, Python 3 none any Details

Total release size: 215.7 kB

Release files / lotrek-django-hvad-2.0.7.tar.gz

Download URL lotrek-django-hvad-2.0.7.tar.gz
Size 108.9 kB
Tags Source
SHA-256 checksum
How to use checksums
98b66fd58b2a4c6ecf7cc72e4e5184ee75fe852f6695ba334032a958b9f868b5
BLAKE2b-256 checksum
How to use checksums
536838f02963b845579ee4b62fb5217ec2edf7e41643d101000dc762b79b17e7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.8.0 pkginfo/1.9.2 readme-renderer/37.3 requests/2.28.1 requests-toolbelt/0.10.1 urllib3/1.26.13 tqdm/4.64.1 importlib-metadata/5.2.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.6 CPython/3.10.9

Release files / lotrek_django_hvad-2.0.7-py2.py3-none-any.whl

Download URL lotrek_django_hvad-2.0.7-py2.py3-none-any.whl
Size 106.8 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
4d063357130670a92b37eb52d151e2d48663094e7cf1cee6a9cf7b7c2ceff980
BLAKE2b-256 checksum
How to use checksums
ea4c79878243192f93c6345cda0a51c40903645066ab62a420235957db9a1be3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.8.0 pkginfo/1.9.2 readme-renderer/37.3 requests/2.28.1 requests-toolbelt/0.10.1 urllib3/1.26.13 tqdm/4.64.1 importlib-metadata/5.2.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.6 CPython/3.10.9

Security for lotrek-django-hvad 2.0.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page