首页 > 解决方案 > Django:如何覆盖模型字段的详细名称和帮助文本

问题描述

我需要一些关于以下问题的更多输入/意见:

我想覆盖某些 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)来实现这一点?也许有一个扩展?

标签: djangodjango-modelsdjango-admin

解决方案


我现在为此创建了一个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 方面更有经验),所以一些输入将不胜感激。


推荐阅读