首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何覆盖Django中继承的模型字段的默认值?

如何覆盖Django中继承的模型字段的默认值?
EN

Stack Overflow用户
提问于 2014-03-20 19:18:44
回答 1查看 717关注 0票数 1

我有一个从夹层的“可显示”模型继承的模型,这个模型本身是从“段式”模型继承的。在段式模型中,有以下几行:

代码语言:javascript
复制
gen_description = models.BooleanField(_("Generate description"),
        help_text=_("If checked, the description will be automatically "
                    "generated from content. Uncheck if you want to manually "
                    "set a custom description."), default=True)

对于我创建的模型,我希望默认行为不会自动创建描述。当然,凌驾于这个领域本身是行不通的。

我最初的猜测是:

代码语言:javascript
复制
def __init__(self,*args,**kwargs):
        self.gen_description = False
        super(CyclesMaterial,self).__init__(*args,**kwargs)

但没有运气。我并没有料到这会奏效,但还是试了一试。

试图找到一个解决方案我找到了this question。所以我试着在我的模型中这样做:

代码语言:javascript
复制
def __init__(self,*args,**kwargs):
        kwargs.setdefault('gen_description', False)
        super(CyclesMaterial,self).__init__(*args,**kwargs)

但这不管用。

要做什么才能实现我想要的?有可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-23 22:12:05

在实例化模型之前,它的字段是Field子类(如BooleanField)的实际实例。直接分配一个值还不起作用。只有在模型的__init__方法中,它们才会被替换为它们的实际值。

这就是第一个方法无法工作的原因:在调用super(CyclesMaterial, self).__init__(*args, **kwargs)之前,尝试分配一个值,然后重写BooleanField实例。该模型不再将gen_description视为模型字段,而是将其视为常规对象属性。

我刚刚测试了你的第二个解决方案,这是我的结果:

代码语言:javascript
复制
# No value set
>>> c = CyclesMaterial()
>>> c.gen_description
False
# Value set to `True`
>>> c = CyclesMaterial(gen_description=True)
>>> c.gen_description
True
# Value set to `False`
>>> c = CyclesMaterial(gen_description=False)
>>> c.gen_description
False

这正是我所期望的行为,如果我正确理解你的问题,那就是你想要的行为。如果没有设置gen_description,那么它将不在kwargs中,而kwargs.set_default('gen_description', False)将将其设置为False。如果它被设置,它将在kwargs中,它的值将被保留,并直接在模型上设置。

编辑

如果您希望在管理界面或其他形式中更改默认值,则必须在窗体中手动重写它。ModelForm是基于类定义生成的,如果不更改所有超类的选项,则无法更改字段的选项。因此,您必须更改表单的initial值,覆盖生成的默认值:

代码语言:javascript
复制
# either this:
form = CyclesMaterialForm(initial={'gen_description': False})

# or this:
class CyclesMaterialForm(forms.ModelForm):
    gen_description = forms.BooleanField(_('Generate description'), 
        help_text=_("If checked, the description will be automatically "
                    "generated from content. Uncheck if you want to manually "
                    "set a custom description."), initial=False, required=False)

然后将表单的所有实例更改为使用第一个解决方案,或者是第二个解决方案中提供的CyclesMaterialForm实例。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22543010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档