| Name | Size |
|---|---|
| .github/workflows/main.yml | 1098B |
| CHANGES.md | 266B |
| LICENSE | 1072B |
| README.md | 2635B |
| parlor/__init__.py | 0B |
| parlor/admin.py | 439B |
| parlor/models.py | 1442B |
| pyproject.toml | 999B |
| tests/__init__.py | 0B |
| tests/models.py | 368B |
| tests/settings.py | 204B |
| tests/tests.py | 1779B |
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
- With django-parlor, the translation model must be created explicitly.
- In the admin UI, django-parlor uses a stock inline instead of a custom tabbed interface.
- django-parlor only provides basic attribute access while django-parler provides a lot more features.