2010-10-06 88 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。但手指交叉。