django-parlor

Django model translations with even less nasty hacks.
git clone https://git.ce9e.org/django-parlor.git

NameSize
.github/workflows/main.yml1098B
CHANGES.md266B
LICENSE1072B
README.md2635B
parlor/__init__.py0B
parlor/admin.py439B
parlor/models.py1442B
pyproject.toml999B
tests/__init__.py0B
tests/models.py368B
tests/settings.py204B
tests/tests.py1779B

django-parlor

Django model translations with even less nasty hacks.

Installation

pip install django-parlor

Usage

from django.contrib import admin
from django.db import models

from parlor.admin import TranslatableAdmin
from parlor.models import TranslatableModel


class MyModel(TranslatableModel):
    ...


class MyModelTranslation(models.Model):
    parent = MyModel.get_parent_field()
    language_code = MyModel.get_language_field()

    label = models.CharField(max_length=32)
    ...

    class Meta:
        unique_together = [('parent', 'language_code')]


admin.site.register(MyModel, TranslatableAdmin)

animal = MyModel.objects.create()
animal.translations.create(language_code='en', label='Frog')
animal.translations.create(language_code='de', label='Frosch')
print(animal.label)

Status

Right now this is more of a proof-of-concept. If people are interested in this library it could certainly be expanded.

Relation to django-parler

Standing on the Shoulders of Giants

There are two popular libraries for model translation in Django: django-modeltranslation and django-parler. The former adds additional columns to the same table while the latter adds a new table for each translatable model. Both of these libraries use a lot of magic which makes them easy to use, but also leads to some hard-to-debug edge cases.

There is also django-translated-fields, which uses the same basic approach as django-modeltranslation, but with much less magic (and much less lines of code).

Here I try to do something similar for django-parler, which has been unmaintained for some time now.

Migration

If you want to migrate from django-parler to django-parlor, you need to replace all instances of parler.TranslatedFields by explicit translation models as described above. Note that the parent field is called master in django-parler.

To keep using the same data, you will also need to set Meta.db_table to the name generated by django-parler (typically myapp_mymodel_translation).

Finally you should run manage.py makemigrations. The generated migrations will only contain minor changes though.

Conceptual differences