Django:如何覆盖模型字段的verbose_name和help_text

时间:2019-03-04 15:02:08

标签: django django-models django-admin

在以下问题上,我需要提出一些建议:

我想为某些Django模型的所有字段覆盖verbose_name和help_text。

我已经有了一个将这些值存储到数据库中的结构。 通过以下方式迭代字段:

Contract._meta.get_fields()

我在此字段中使用具有初始/默认值的表单集。到目前为止,这很好。我现在的问题是,我想在模型中保留默认值,并希望在访问值的所有位置(管理员表单,表单,模板等)都覆盖默认值。

我想像Mixin之类的东西,虽然我想然后我必须改变太多的Django代码。已经起作用的另一种可能性是调用函数而不是verbose_name和help_text。

例如:

title = models.CharField(max_length=120, blank=True, null=True, verbose_name=get_vname('title') help_text=get_help_text('title'))
title_long = models.CharField(max_length=120, blank=True, null=True, verbose_name=get_vname('title_long') help_text=get_help_text('title_long'))

但是太多的手动更改,我也需要存储默认值。 有更好的方法(DRY)来实现吗?也许有扩展名?

1 个答案:

答案 0 :(得分:0)

我现在为此创建了一个mixin

class ChangeFieldNamesMixin(models.Model):

def __init__(self, *args, **kwargs):
    model_fields = self._meta.get_fields()
    initialise_texts(self._meta.model_name, model_fields)
    super(ChangeFieldNamesMixin, self).__init__(*args, **kwargs)

class Meta:
    abstract = Trueenter code here

def initialise_texts(name, model_fields):
model_field_name = name + 'Field'
Model = apps.get_model("custom", model_field_name)
field_names_to_create = []
field_dict = compose_field_dict(name, Model)

# create entries in table if empty
if len(field_dict) == 0:
    for entry in model_fields:
        if entry.editable:
            attrs = {'name': entry.name, 'help_text': entry.help_text, 'label': entry.verbose_name}
            new_entry = Model(**attrs)
            field_names_to_create.append(new_entry)

            print('Saving {}'.format(new_entry))
    field_list = Model.objects.bulk_create(field_names_to_create)
    compose_field_dict(name, Model, field_list)
else:

    for entry in model_fields:
        if entry.editable:
            key = entry.name

            if key in field_dict.keys():
                setattr(entry, 'verbose_name', field_dict[key].label)
                setattr(entry, 'help_text', field_dict[key].help_text)

我对该解决方案不太满意,因为我认为必须有一种更好的方法来初始化数据库中的字段。我对django和python开发非常陌生(对Java有更多的经验),所以请多加投入。