Локализация модели с древовидной структурой
Я новичок в разработке на python/django и я застрял.
Я делаю проект на Django 4.0.4. У меня есть таблица дерева в базе данных SQLite.
В панели администратора я настроил ее, используя класс DraggableMPTTAdmin из mptt. Я также хочу локализовать поля этой таблицы.
QUESTION: Как я могу объединить класс DraggableMPTTAdmin с классом TranslationAdmin?
my_app/models.py
from django.db import models
from mptt.models import MPTTModel, TreeForeignKey
from django.db.models import CharField
class NonStrippingCharField(CharField):
"""A TextField that does not strip whitespace at the beginning/end of
it's value. Might be important for markup/code."""
def formfield(self, **kwargs):
kwargs['strip'] = False
return super(NonStrippingCharField, self).formfield(**kwargs)
class CategoriesAndAreas(MPTTModel):
name = NonStrippingCharField(max_length=150, unique=False)
is_category = models.BooleanField()
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
def __str__(self):
return self.name
def __unicode__(self):
return self.name
class MPTTMeta:
order_insertion_by = ['name']
class Meta:
verbose_name = "Category or area"
verbose_name_plural = "Categories and areas"
my_app/translations.py
from modeltranslation.translator import register, TranslationOptions
from .models import CategoriesAndAreas
@register(CategoriesAndAreas)
class CategoriesAndAreasTranslationOptions(TranslationOptions):
fields = ('name',)
my_app/admin.py + DraggableMPTTAdmin
from django.contrib import admin
from mptt.admin import DraggableMPTTAdmin
from .models import CategoriesAndAreas
admin.site.register(CategoriesAndAreas, DraggableMPTTAdmin,
list_display=(
'tree_actions',
'indented_title',
'is_category',
),
list_display_links=(
'indented_title',
),
)
Таблица имеет древовидную структуру с возможностью перетаскивания. Форма для редактирования элемента содержит дополнительное поле.
my_app/admin.py + TranslationAdmin
from django.contrib import admin
from modeltranslation.admin import TranslationAdmin
from .models import CategoriesAndAreas
admin.site.register(CategoriesAndAreas, TranslationAdmin)
Структура таблицы линейная. Здесь все в порядке.
my_app/admin.py + TranslationAdmin + DraggableMPTTAdmin
from django.contrib import admin
from mptt.admin import DraggableMPTTAdmin
from modeltranslation.admin import TranslationAdmin
from .models import CategoriesAndAreas
class TranslationCategoriesAndAreas(CategoriesAndAreas, TranslationAdmin):
pass
admin.site.register(TranslationCategoriesAndAreas, DraggableMPTTAdmin,
list_display=(
'tree_actions',
'indented_title',
'is_category',
),
list_display_links=(
'indented_title',
),
)
ERROR: class TranslationCategoriesAndAreas(CategoriesAndAreas, TranslationAdmin): TypeError: конфликт метаклассов: метакласс производного класса должен быть (нестрогим) подклассом метаклассов всех его баз
.
Я не совсем понимаю, как работает админ-панель, поэтому у меня возникли трудности. Методом проб и ошибок я пришел к результату. Для опытного разработчика это было бы просто...
my_app/admin.py + TranslationAdmin + DraggableMPTTAdmin
from django.contrib import admin
from mptt.admin import DraggableMPTTAdmin
from modeltranslation.admin import TranslationAdmin
from .models import CategoriesAndAreas
class DraggableTranslationAdmin(TranslationAdmin, DraggableMPTTAdmin):
pass
admin.site.register(CategoriesAndAreas, DraggableTranslationAdmin,
list_display=(
'tree_actions',
'indented_title',
'is_category',
),
list_display_links=(
'indented_title',
),
)