2010-10-06 86 views
1

我想解决Django中与模型继承有关的问题。我有四个相关机型:OrderOrderItem具有ForeignKey的到Order再有就是Orderable模式,即模型继承父儿童模型,如FeeRentedProduct等。在蟒蛇,它是这样的(仅发布相关部分):Django内嵌模型继承目标

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 inline解决,或者你会建议创建特殊的用户界面?

在此先感谢您的任何提示。

回答

0

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

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

+0

嗨,因为在你之前似乎没有人回答过这个问题,所以我亲自选择了通过特殊界面的方式。试图通过内联锻造这件事情对我所需要完成的事情来说太困难了。尽管如此,请看看FeinCMS解决方案。谢谢 ;) – xaralis 2011-01-07 08:29:47

0

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