我正在尝试解决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')
我希望将内联绑定到Order模型以启用编辑OrderItems。问题是,OrderItem中的目标字段指向Orderable(不是通过调用Orderable的cast
方法可以获得的具体类),因此内联中的表单不完整。
有没有人有这个想法,如何为此创建至少一个用户友好的界面?它可以通过Django admin内联解决,或者你建议创建特殊的用户界面吗?
提前感谢任何提示。
答案 0 :(得分:0)
尝试继承OrderItemInlineAdmin的Form a在那里定义自己的Form。但是手指交叉了。
答案 1 :(得分:0)
我正在寻找一个可靠的答案,但你应该看看FeinCMS。他们做得很好。
例如,参见FeinCMS inline editor。我需要弄清楚如何使其适应我的代码。