django - 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)来实现这一点?也许有一个扩展?
解决方案
我现在为此创建了一个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 方面更有经验),所以一些输入将不胜感激。
推荐阅读
- json - VB.NET 反序列化 JSON - 无法将当前 JSON 对象反序列化为类型 .Customer[]',因为该类型需要 JSON 数组
- javascript - 使用 BaconJS 发布订阅
- typescript - 如何查看 TypeScript 文件的代码而不是声明?
- r - 提取具有连通值和受限方向的子矩阵
- python - 尝试在 Django 中更新记录时出现递归错误
- mysql - SQL:给出收入高于经理的员工的姓名
- ios - 如何在 Swift 4 中将比特币从一个钱包发送到另一个钱包
- react-native - 在带有 React-native-firebase 的 iOS 上没有推送通知。尝试从控制台发送时,团队 ID 密钥 ID 和 APNs 身份验证组合键无效
- javascript - 删除后的数据表导出值
- javascript - 无法加载“用户名:密码 http:// 链接:跨源请求仅支持协议方案 http、数据、chrome、chrome-extension