Django内联模型继承目标

时间:2010-10-06 07:35:58

标签: django inheritance django-admin inline

我正在尝试解决Django中与模型继承相关的问题。我有四个相关模型:OrderOrderItem,其中包含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')

我希望将内联绑定到Order模型以启用编辑OrderItems。问题是,OrderItem中的目标字段指向Orderable(不是通过调用Orderable的cast方法可以获得的具体类),因此内联中的表单不完整。

有没有人有这个想法,如何为此创建至少一个用户友好的界面?它可以通过Django admin内联解决,或者你建议创建特殊的用户界面吗?

提前感谢任何提示。

2 个答案:

答案 0 :(得分:0)

尝试继承OrderItemInlineAdmin的Form a在那里定义自己的Form。但是手指交叉了。

答案 1 :(得分:0)

我正在寻找一个可靠的答案,但你应该看看FeinCMS。他们做得很好。

例如,参见FeinCMS inline editor。我需要弄清楚如何使其适应我的代码。