Django 1.11中如何让外键自动使用关联模型的verbose_name?
让Django外键自动使用关联模型的verbose_name
嘿,这个需求确实很实用!不过在Django 1.11里,默认情况下外键字段的verbose_name并不会自动继承关联模型的verbose_name——它默认会把字段名转换成“人性化”的格式(比如some_field会变成Some field)。不过我们可以通过自定义字段的方式轻松实现你要的效果,甚至能全局复用这个逻辑。
方法一:自定义VerboseForeignKey字段
我们可以封装一个自己的ForeignKey子类,在初始化的时候自动检查是否设置了verbose_name,如果没有,就用关联模型的verbose_name来填充:
from django.db import models from django.apps import apps class VerboseForeignKey(models.ForeignKey): def __init__(self, to, **kwargs): # 仅当没有显式传入verbose_name时才自动设置 if 'verbose_name' not in kwargs: # 处理两种情况:to是模型类,或者是字符串格式的"app.Model" if isinstance(to, str): app_label, model_name = to.split('.') model_class = apps.get_model(app_label, model_name) else: model_class = to # 关联模型的verbose_name就是我们要的字段verbose_name kwargs['verbose_name'] = model_class._meta.verbose_name super().__init__(to, **kwargs)
然后在你的模型里直接用这个自定义字段就行:
class ModelA(models.Model): class Meta: verbose_name = 'my awesome name' class ModelB(models.Model): # 不用显式设置verbose_name,自动用ModelA的verbose_name some_field = VerboseForeignKey(ModelA)
这样ModelB的some_field字段,其verbose_name就会自动变成my awesome name,完全符合你的预期。
为什么Django默认不这么做?
其实Django这么设计是留了灵活性——有时候外键的语义和关联模型的名称并不完全匹配。比如你有个author = ForeignKey(User),可能你更希望字段显示为“作者”而不是User模型的verbose_name(比如“用户”),所以默认让开发者自己控制会更灵活。不过如果你的项目里大部分外键都需要这种行为,自定义字段绝对是最高效的方案。
内容的提问来源于stack exchange,提问作者David Dahan
相关产品推荐
相关产品推荐

