Локализация модели с древовидной структурой

Я новичок в разработке на 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',
    ),
)
Вернуться на верх