为所有型号提供功能

时间:2014-05-18 08:43:49

标签: python django model

我的一个模特中有以下功能

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>

2 个答案:

答案 0 :(得分:1)

你可以使用Mixins。

实施例

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):
    ...

答案 1 :(得分: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):
           ...