2017-02-21 3 views
0

Ich versuche, die Attribute eines untergeordneten Modells in einer Vorlage zu durchlaufen, insbesondere möchte ich nur auf die Attribute von childs zugreifen. Zur Laufzeit werde ich nicht wissen, welche konkrete Unterklasse es ist. Mit django-model-utils Ich habe in der Lage, die Unterklasse statt den Eltern zurückzukehren, das ist ein Anfang, aber wenn ich seine Attribute zugreifen ich sowohl die Eltern und die Childs zurück:Greifen Sie auf Kindmodellklassenattribute in der Vererbung mehrerer Tabellen in Django zu

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) 

Vorlage

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

Soll das nicht so sein? Ein Kind erbt die Attribute des Elternteils. Es ist also normal, dass auch 'Produkt'-Attribute wie' created_at' angezeigt werden, nein? – LaundroMat

+0

@LaundroMat Ich nehme an, aber ich versuche einen Weg zu finden, nur die Attribute des Kindes zurückzugeben, wenn das möglich ist – KingFu

+1

Oh ok dann :) Vielleicht kann diese Antwort dich auf den Weg bringen? http://stackoverflow.com/questions/7136154/python-how-to-get-subclasss-new-attributes-name-in-base-classs-method – LaundroMat

Antwort

1

können Sie etwas tun, wie folgt aus:

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

danke das funktioniert, du vermisst ein _ nach "__class_" obwohl. – KingFu

+0

Kein Problem, behoben. –

Verwandte Themen