Реализация встроенного представления ListField в Django-nonrel

Можно ли использовать что-то похожее на встроенные реляционные элементы из администратора 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?


person Adam Ness    schedule 17.02.2012    source источник


Ответы (1)


Это не так просто сделать из коробки. Вам нужно будет управлять полями типа 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

Использовать поля ListField в панели администратора 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
person Saeed    schedule 23.11.2015