2014-05-18 50 views
1

我在我的模型製作功能適用於所有型號

def get_fields(self): 
    return[(field.name, field.value_to_string(self)) for field in MusicPack._meta.fields] 

這幫助我遍歷一個模型的所有領域,並將其顯示到模板之一以下功能。我如何將這個實現到我的所有模型而不復制數據庫中每個模型中的兩條線?

我只是做一個超類包含所有模型的功能,然後讓我的所有模型的孩子呢?

template.html

<div id = "subtemplate"> 
    <ul> 
    {% for model in object_list %} 
     <div class = modeldiv> 
     {% for name,value in model.get_fields %} 
      <li> 
      {% if value %} 
      {{ name|capfirst }} : {{ value }} 
      {% endif %} 
      </li> 
      {% endfor %} 
      </div> 
      {% empty %} 
      <li> No objects created yet. </li> 
      {% endfor %} 
    </ul> 
</div> 
+0

它取決於,但在某些情況下'from my_module import get_fields'可能有效。 –

回答

1

你可以使用混入。

class Mixin(object): 
    def get_fields(self): 
     return[(field.name, field.value_to_string(self)) for field in self.__class__._meta.fields] 

class A(models.Model, Mixin): 
    ... 

class B(models.Model, Mixin): 
    ... 
+0

在對主題進行快速的Google搜索之後,這正是我正在尋找的內容。謝謝 – tama

+0

@tama如果這個或任何答案已解決您的問題,請點擊複選標記,考慮[接受它](http://meta.stackexchange.com/q/5234/179419)。這向更廣泛的社區表明,您已經找到了解決方案,併爲答覆者和您自己提供了一些聲譽。沒有義務這樣做。 –

+0

@Maxime Lorant,謝謝你!我對這個網站還很陌生。乾杯 – tama

0

把該方法在一個基類肯定是要做到這一點的一種方式。另一種方法是在某些實用程序模塊中將其作爲通用實用程序函數,用於打印對象中的所有字段,您可以在渲染模板之前調用該函數。

from myproject.utilities import get_fields 

... 

return render_template("template.html", get_fields(model)) 

還有第三種方法是寫一個類的裝飾,提供此功能的一類:

class with_get_fields(cls): 

    def __init__(self, *args, **kwargs): 
     cls.__init__(self, *args, **kwargs) 

    def get_fields(): 
     return [(field.name, field.value_to_string(self)) for field in cls.fields] 

,然後將它應用到你希望有這個功能

任何模型類
@with_get_fields 
class model(): 

     def __init___(self): 
      ... 
相關問題