Django inline для модели наследования цели - PullRequest
1 голос
/ 06 октября 2010

Я пытаюсь решить проблему, связанную с наследованием модели в Django.У меня есть четыре соответствующие модели: Order, OrderItem, для которого ForeignKey равен Order, а затем есть модель Orderable, которая является суперклассом наследования моделей для дочерних моделей, таких как Fee, RentedProduct и т. Д. В python этовыглядит так (размещение только релевантных частей):

class Orderable(models.Model):
    real_content_type = models.ForeignKey(ContentType, editable=False)  

    objects = OrderableManager()

    available_types = []

    def save(self, *args, **kwargs):
        """
        Saves instance and stores information about concrete class.
        """
        self.real_content_type = ContentType.objects.get_for_model(type(self))
        super(Orderable, self).save(*args, **kwargs)

    def cast(self):
        """
        Casts instance to the most concrete class in inheritance hierarchy possible.
        """
        return self.real_content_type.get_object_for_this_type(pk=self.pk) 

    @staticmethod
    def register_type(type):
        Orderable.available_types.append(type)

    @staticmethod
    def get_types():
        return Orderable.available_types

class RentedProduct(Orderable):
    """
    Represent a product which is rented to be part of an order
    """
    start_at = models.ForeignKey(Storage, related_name='starting_products',
        verbose_name=_('Start at'))
    real_start_at = models.ForeignKey(Storage, null=True,
        related_name='real_starting_products', verbose_name=_('Real start at'))
    finish_at = models.ForeignKey(Storage, related_name='finishing_products',
        verbose_name=_('Finish at'))
    real_finish_at = models.ForeignKey(Storage, null=True,
        related_name='real_finishing_products', verbose_name=_('Real finish at'))

    target = models.ForeignKey(Product, verbose_name=_('Product'))

Orderable.register_type(RentedProduct)

class OrderItem(BaseItem):
    unit_price = models.DecimalField(max_digits=8, decimal_places=2, 
        verbose_name=_('Unit price'))
    count = models.PositiveIntegerField(default=0, verbose_name=_('Count'))
    order = models.ForeignKey('Order', related_name='items',
        verbose_name=_('Order'))
    discounts = models.ManyToManyField(DiscountDescription,
        related_name='order_items', through=OrderItemDiscounts, blank=True,
        verbose_name=_('Discounts'))

    target = models.ForeignKey(Orderable, related_name='ordered_items',
        verbose_name=_('Target'))

    class Meta:
        unique_together = ('order', 'target')

Я хотел бы привязать строку к модели заказа, чтобы можно было редактировать элементы заказа.Проблема заключается в том, что поле назначения в OrderItem указывает на Orderable (не конкретный класс, который можно получить, вызвав метод cast Orderable), и поэтому встроенная форма не является полной.

Есть ли у кого-нибудь идея?Как создать хотя бы немного удобный интерфейс для этого?Может ли это быть решено только в админке Django, или вы бы предложили создать специальный пользовательский интерфейс?

Заранее благодарим за любые советы.

Ответы [ 2 ]

0 голосов
/ 07 января 2011

Я ищу надежный ответ на этот вопрос, но вы должны проверить FeinCMS. Они делают это довольно хорошо.

См., Например, встроенный редактор FeinCMS . Мне нужно выяснить, как адаптировать это к моему коду.

0 голосов
/ 12 октября 2010

Попробуйте унаследовать форму OrderItemInlineAdmin и определить свою собственную форму там.Но пальцы скрещены за это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...