2010-09-07 31 views
24

我在我的一个管理模型中添加了一些内联,这些内置的默认值在使用“添加另一个...”添加新实例时可能不需要更改。不幸的是,除非某些值已经改变,否则django不会将这些内联识别为新对象。这迫使我添加一个内联,更改一个任意值,保存,更改该值并再次保存以达到所需的效果。如何强制保存“空”/不变的django管理内联?

我到目前为止唯一的解决方案是添加一个隐藏的'changed'字段,当添加一个新的内联时,这个字段将通过java脚本填充。由于这感觉非常黑客,我希望有一个更优雅的解决方案。

任何想法将不胜感激。

谢谢Daniel。

回答

45

我花了相当长的一段时间才弄清楚,但实际上很简单。

from django.contrib import admin 
from django.forms.models import BaseInlineFormSet, ModelForm 

class AlwaysChangedModelForm(ModelForm): 
    def has_changed(self): 
     """ Should returns True if data differs from initial. 
     By always returning true even unchanged inlines will get validated and saved.""" 
     return True 

class CheckerInline(admin.StackedInline): 
    """ Base class for checker inlines """ 
    extra = 0 
    form = AlwaysChangedModelForm 
+1

+ 1毕竟这是非常明显的。 – 2013-02-18 09:30:02

+4

我不会说明显的,但绝对简单真棒! – 2013-08-28 01:35:29

3

@daniel答案是伟大的,但它会尝试保存,如果没有变化由已经创造了有史以来的实例,这是没有必要的,更好的使用它,如:

class AlwaysChangedModelForm(ModelForm): 
    def has_changed(self, *args, **kwargs): 
     if self.instance.pk is None: 
      return True 
     return super(AlwaysChangedModelForm, self).has_changed(*args, **kwargs)