【问题标题】:Django DRY verbose names with foreign keys?Django DRY 带有外键的详细名称?
【发布时间】:2018-09-13 16:48:14
【问题描述】:
class ModelA(models.Model):
    class Meta:
        verbose_name = 'my awesome name'

class ModelB(models.Model):
    some_field = models.ForeignKey(ModelA)

有没有办法让some_field 的verbose_name 成为my awesome name 而无需明确说明? (即使用详细名称相关类作为默认字段详细名称,而不是使用属性名称) 我实际上认为这应该是默认的 Django 行为。

注意:我使用的是 Django 1.11

【问题讨论】:

    标签: python django


    【解决方案1】:

    查看源代码,似乎这是在RelatedField 类的set_attributes_from_rel 方法中实现的:

    if self.verbose_name is None:
        self.verbose_name = self.remote_field.model._meta.verbose_name
    

    verbose_name 也在Field 类的set_attributes_from_name 方法中设置:

    if self.verbose_name is None and self.name:
        self.verbose_name = self.name.replace('_', ' ')
    

    此方法首先运行,因此当RelatedField 类的方法运行时self.verbose_name 不再是None。我不清楚为什么首先运行 Field 类的方法。

    注意:我检查了 GitHub 上的当前源代码,这很可能是比您的代码新的版本,因为您的 ForeignKey 没有 2.0 版中所需的 on_delete 参数。

    【讨论】:

    • 优秀的答案!但更进一步:该怎么办?定义一个自定义的ForeignKey 类?
    • 可以在this ticket 中找到有关此问题的讨论。遗憾的是,由于不向后兼容,状态为 wontfix,但 cmets 通过将 verbose_name 提供为 verbose_name=ModelA._meta.verbose_name 提供了另一种选择。
    • @ikkuh 非常感谢您的调查 :) 根据我在会谈中的理解,这最初是有效的,但是他们在某个时候因为另一个功能而破坏了它,然后,没有发现对修复它,似乎有_meta 解决方法,这是一个可以接受的解决方案。
    猜你喜欢
    • 2020-06-26
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2023-03-26
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    相关资源
    最近更新 更多