2017-02-21 17 views
0

私はテンプレート内の子モデルインスタンスの属性を反復しようとしています。特に、子属性にアクセスしたいだけです。実行時には、それがどのような具体的なサブクラスであるのか分かりません。私が代わりに開始され、親のサブクラスを返すことができましたdjango-model-utilsを使用して、私はその属性にアクセスするときに私が手両親チャイルズが返さ:Djangoのマルチテーブル継承の子モデルクラス属性へのアクセス

class Product(models.Model): 
     created_at  = models.DateTimeField(default=timezone.now) 
     updated_at  = models.DateTimeField(auto_now=True) 
     name   = models.CharField(...) 
     objects = InheritanceManager() 

     def attrs(self): 
      for attr, value in self.__dict__.iteritems(): 
       yield attr, value 

    class Vacuum(Product): 
     power   = models.DecimalField(...) 

    class Toaster(Product): 
     weight   = models.DecimalField(...) 

views.py

def product_detail(request, slug): 
    product = Product.objects.get_subclass(slug=slug) 

テンプレート

{% for name, value in product.attrs %} 
      <td>{{ name }}</td> 
      <td>{{ value }}</td> 
{% endfor %} 
+0

そうではありませんか?子供は親の属性を継承するので、 'created_at'のような' Product'属性も表示されます。 – LaundroMat

+0

@LaundroMatそうだと思いますが、これが可能であれば、子供の属性のみを返す方法を見つけようとしています – KingFu

+1

ああ、それでは:)この答えはあなたのところに置くことができますか? http://stackoverflow.com/questions/7136154/python-how-to-get-subclasss-new-attributes-name-in-base-classs-method – LaundroMat

答えて

1

あなたはこのような何かを行うことができます。

def product_detail(request, slug): 
    product = Product.objects.get_subclass(slug=slug) 
    child_fields = [i for i in product.__class__.__dict__ if 
        not i.startswith("__") and not hasattr(Product, i)] 
    product_attrs = [(name, getattr(product,name)) for name in child_fields] 
    # pass product_attrs to your template 
+0

これはありがとう、あなたは_ _class_の後に_が不足しています。 – KingFu

+0

問題はありません。 –

関連する問題