我的一个模特中有以下功能
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 :(得分: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):
...