我有一个从夹层的“可显示”模型继承的模型,这个模型本身是从“段式”模型继承的。在段式模型中,有以下几行:
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)对于我创建的模型,我希望默认行为不会自动创建描述。当然,凌驾于这个领域本身是行不通的。
我最初的猜测是:
def __init__(self,*args,**kwargs):
self.gen_description = False
super(CyclesMaterial,self).__init__(*args,**kwargs)但没有运气。我并没有料到这会奏效,但还是试了一试。
试图找到一个解决方案我找到了this question。所以我试着在我的模型中这样做:
def __init__(self,*args,**kwargs):
kwargs.setdefault('gen_description', False)
super(CyclesMaterial,self).__init__(*args,**kwargs)但这不管用。
要做什么才能实现我想要的?有可能吗?
发布于 2014-03-23 22:12:05
在实例化模型之前,它的字段是Field子类(如BooleanField)的实际实例。直接分配一个值还不起作用。只有在模型的__init__方法中,它们才会被替换为它们的实际值。
这就是第一个方法无法工作的原因:在调用super(CyclesMaterial, self).__init__(*args, **kwargs)之前,尝试分配一个值,然后重写BooleanField实例。该模型不再将gen_description视为模型字段,而是将其视为常规对象属性。
我刚刚测试了你的第二个解决方案,这是我的结果:
# 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值,覆盖生成的默认值:
# 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实例。
https://stackoverflow.com/questions/22543010
复制相似问题