Реализация встроенного для представления ListField в Django-nonrel - PullRequest
5 голосов
/ 17 февраля 2012

Можно ли использовать нечто похожее на встроенные реляционные элементы от администратора Django для представления встроенных моделей в ListField?

Например, у меня есть следующие модели:

class CartEntry(model.Model):
    product_name=model.CharField( max_length=20 )
    quantity = model.IntegerField()

class Cart(model.Model):
    line_items = ListField(EmbeddedModelField('CartEntry'))

Я пытался использовать стандартное встраивание, но я знаю, что это неправильно:

class CartEntryInline( admin.StackedInline ):
    model=CartEntry

class CartAdmin(admin.ModelAdmin)
    inlines=[CartEntryInline]

Но, очевидно, это не сработает, поскольку нет связи с внешним ключом. Есть ли способ сделать это в django-nonrel?

1 Ответ

0 голосов
/ 23 ноября 2015

Это не так просто сделать из коробки. Вам нужно будет управлять полями типов ListField и EmbeddedModelField в административном модуле Django и выполнить некоторые действия по взлому. Вам придется реализовать две части:

Использовать EmbeddedModelField в админке Django

Вам нужно определить класс, который обрабатывает объекты EmbeddedModelField, чтобы он работал с администратором Django. Здесь - это ссылка, где вы можете найти отличные примеры кодов. Ниже приведены только блоки кода для демонстрации:

Добавьте этот класс в файл models.py и используйте EmbedOverrideField вместо EmbeddedModelField в Cart модели:

class EmbedOverrideField(EmbeddedModelField):
    def formfield(self, **kwargs):
        return models.Field.formfield(self, ObjectListField, **kwargs)

Реализация класса в forms.py, который имеет два метода:

class ObjectListField(forms.CharField):
    def prepare_value(self, value):
        pass # you should actually implement this method

    def to_python(self, value):
        pass # Implement this method as well

Использовать ListFields в админке Django

Вам также нужно определить класс, который обрабатывает объекты ListField, чтобы он работал с администратором Django. Здесь - это ссылка, где вы можете найти отличные примеры кодов. Ниже приведены только блоки кода для демонстрации:

Добавьте этот класс в файл models.py и ItemsField вместо ListField в Cart модели:

class ItemsField(ListField):
    def formfield(self, **kwargs):
        return models.Field.formfield(self, StringListField, **kwargs)

Реализация класса в forms.py, который имеет два метода:

class StringListField(forms.CharField):
    def prepare_value(self, value):
        pass # you should actually implement this method

    def to_python(self, value):
        pass # Implement this method as well
...