CMSの一連のDjangoモデルを作成して、一連のProduct
を表示しました。Django:複数の子モデルタイプを持つ親モデル
class ProductBanner(ProductRow):
wide_image = models.ImageField(upload_to='product_images/banners/', max_length=100, null=False, blank=False)
top_heading_text = models.CharField(max_length=100, null=False, blank=False)
main_heading_text = models.CharField(max_length=200, null=False, blank=False)
...
class ProductMagazineRow(ProductRow):
title = models.CharField(max_length=50, null=False, blank=False)
show_descriptions = models.BooleanField(null=False, blank=False, default=False)
panel_1_product = models.ForeignKey(Product, related_name='+', null=False, blank=False)
panel_2_product = models.ForeignKey(Product, related_name='+', null=False, blank=False)
panel_3_product = models.ForeignKey(Product, related_name='+', null=False, blank=False)
...
class ProductTextGridRow(ProductRow):
title = models.CharField(max_length=50, null=False, blank=False)
col1_title = models.CharField(max_length=50, null=False, blank=False)
col1_product_1 = models.ForeignKey(Product, related_name='+', null=False, blank=False)
col1_product_2 = models.ForeignKey(Product, related_name='+', null=False, blank=False)
col1_product_3 = models.ForeignKey(Product, related_name='+', null=False, blank=False)
...
ので:
各ページには、一連の行が含まれているので、私は一般的な
class ProductRow(models.Model):
slug = models.SlugField(max_length=100, null=False, blank=False, unique=True, primary_key=True)
name = models.CharField(max_length=200,null=False,blank=False,unique=True)
active = models.BooleanField(default=True, null=False, blank=False)
を持って、私は、行の種類ごとに、このモデルの子供たちのシリーズを、持っていますに。
はその後、私のProductPage
に私はProductRow
の一連の持っている:、
class ProductPage(models.Model):
slug = models.SlugField(max_length=100, null=False, blank=False, unique=True, primary_key=True)
name = models.CharField(max_length=200, null=False, blank=False, unique=True)
title = models.CharField(max_length=80, null=False, blank=False)
description = models.CharField(max_length=80, null=False, blank=False)
row_1 = models.ForeignKey(ProductRow, related_name='+', null=False, blank=False)
row_2 = models.ForeignKey(ProductRow, related_name='+', null=True, blank=True)
row_3 = models.ForeignKey(ProductRow, related_name='+', null=True, blank=True)
row_4 = models.ForeignKey(ProductRow, related_name='+', null=True, blank=True)
row_5 = models.ForeignKey(ProductRow, related_name='+', null=True, blank=True)
私が持っている問題を、私はProductPage
のもの5行が別の子タイプのいずれかとすることができるようにしたいということですProductRow
。しかし、私は、このようなviews.py
で
としてそれらを反復する場合:
product_page_rows = [product_page.row_1,product_page.row_2,product_page.row_3,product_page.row_4,product_page.row_5]
して、テンプレートに:
{% for row in product_page_rows %}
<pre>{{ row.XXXX }}</pre>
{% endfor %}
私はXXXX
としてどの子フィールドを参照することはできません。
Iはしようとすると、各行がどのクラスを区別するために、親と子供の両方に "type
()" メソッドを追加しようとした:
class ProductRow(models.Model):
...
@classmethod
def type(cls):
return "generic"
と
class ProductTextGridRow(TourRow):
...
@classmethod
def type(cls):
return "text-grid"
私が変更された場合XXXX
の.type()
のテンプレートでは、リスト内のすべての項目に対して"generic"
が表示されます(データのさまざまな行タイプを定義していました)ので、すべてがProductRow
ラット彼女は適切な子供の種類よりも。私は子供が親のタイプではなく正しい子のタイプとしてアクセスできるようにする方法や、実際にどの子供のタイプであるかを判断する方法を見つけることができません(私はcatch
を送ってAttributeError
を試しました。
誰も共通の親を含むさまざまなモデルタイプのリストを適切に処理し、適切な子モデルタイプのフィールドにアクセスできるように助言できますか?
何かはあなたがすべてのそれらのモデル内に複数の 'ForeignKey'sをしてもよろしいです...ここで間違って見えますか?それぞれの 'ForeignKey'は' 1-N'関係を表しています。例えば、あなたのモデル 'ProductRow'は' ProductPage'で異なることを表す5つの異なる関係を持っています。これがあなたが望むものかどうかを確認するだけです。 –
はい、各商品ページには、さまざまなProductRowタイプのいずれか – alexbfree
なり、それぞれが5つの行を持つことになります...と、各製品の行は、それが簡単になります場合は、指向より多くの標準オブジェクトを検討し、複数の異なるページ – alexbfree