【问题标题】:Changing properties of inherited field更改继承字段的属性
【发布时间】:2009-12-21 14:38:56
【问题描述】:

我想更改从基类继承的模型字段的属性。我在下面尝试这个的方式似乎没有任何效果。有任何想法吗?

def __init__(self, *args, **kwargs):
    super(SomeModel, self).__init__(*args, **kwargs)
    f = self._meta.get_field('some_field')
    f.blank = True
    f.help_text = 'This is optional'

【问题讨论】:

  • 你为什么不直接覆盖该字段?为什么要这么做?
  • 我认为重新定义字段会引发 django.core.exceptions.FieldError? (本地字段 foo ... 与基类中类似名称的字段冲突)我错过了什么吗?
  • 来自手册:“如果您覆盖任何祖先模型中的任何模型字段,Django 将引发 FieldError 异常。” docs.djangoproject.com/en/dev/topics/db/models
  • 听起来你是从一个具体的models.Model类继承而不是抽象基类,对吗?
  • 不,我有自己的基类 AbstractArticle,它的子类应该处理一些不同的字段。

标签: python django django-models


【解决方案1】:

所以..您需要更改空白和 help_text 属性..而且我假设您需要此功能以便 help_text 显示在表单中,并且表单不会引发“此字段是必需的”

所以在表单中这样做:

class MyForm(ModelForm):
   class Meta:
      model = YourModel

   some_field = forms.CharField(required=False, help_text="Whatever you want")

【讨论】:

    【解决方案2】:

    好吧,这根本不可能,原因如下:

    http://docs.djangoproject.com/en/1.1/topics/db/models/#field-name-hiding-is-not-permitted

    编辑: 顺便说一句:不要尝试在构造函数中更改类属性,这不是明智之举。基本上,您要做的是在创建行时更改表格。如果您只是使用 SQL,您不会那样做,对吧:)?完全不同的事情是以这种方式更改表单 - 我经常动态更改 instance 一个表单,但是我仍然只更改这个实例,而不是要使用的整个表单模板(一个类)(例如动态添加一个字段,在这个表单实例中是必需的)。

    【讨论】:

    • 看来 abstract = True 正是我想要的。但是,在您的示例中,我认为您的意思是对 A.class B(A) 进行子类化,这会导致完全相同的错误。
    • 是的,这就是我的本意。它引发了一个例外?当我可以访问我的开发机器时,我会看看它。
    • 我添加了一个链接,你应该会感兴趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多