在以下问题上,我需要提出一些建议:
我想为某些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)来实现吗?也许有扩展名?
答案 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有更多的经验),所以请多加投入。