我的项目中有典型的模型继承:
class A(models.Model):
boolean_field = models.BooleanField(default=True)
class B(A):
some_other_field = models.CharField()
我想在类boolean_field
中覆盖B
的默认值,我该怎么办?
我认为在数据库层上做这件事可能很棘手,所以至少我可以简单地覆盖Django admin中的默认值(我的意思是ModelAdmin
形式的类B
)。
答案 0 :(得分:5)
正如您所说,我认为最简单的方法是更改django admin中用于B
模型的模型表单。
要更改表单字段的初始值,您可以重新定义字段,也可以覆盖__init__
方法。
class BForm(forms.ModelForm):
# either redefine the boolean field
boolean_field = models.BooleanField(initial=False)
class Meta:
model = B
# or override the __init__ method and set initial=False
# this is a bit more complicated but less repetitive
def __init__(self, *args, **kwargs):
super(BForm, self).__init__(*args, **kwargs)
self.fields['boolean_field'].initial = False
在django admin中使用自定义模型表单很简单!
class BAdmin(admin.ModelAdmin):
form = BForm
admin.site.register(B, BAdmin)
答案 1 :(得分:1)
class A(models.Model):
boolean_field = models.BooleanField(default=True)
def __unicode__(self):
return self. boolean_field
class B():
some_other_field = models.CharField()
default_fiel_from_bool = models.ForeignKey(A)
答案 2 :(得分:0)
从changed开始,我发现最简单的方法是覆盖函数get_changeform_initial_data。
以下是我将其应用于项目的方式。
在此示例中,我有一个名为 Step 的ORM类和一个名为 StepAdmin 的Admin类。函数 get_latest_step_order 从表中的最新对象获取step_order。
通过覆盖admin类中的 get_changeform_initial_data 函数,我可以为管理界面中创建的每个新对象设置步骤顺序。
class Step(models.Model):
step_name = models.CharField(max_length=200)
step_status = models.ForeignKey(StepStatus, null=True)
step_order = models.IntegerField()
def get_latest_step_order():
return Step.objects.latest('step_order').step_order+1
class StepAdmin(admin.ModelAdmin):
fields = ["step_name","step_status","step_order"]
def get_changeform_initial_data(self, request):
return {
'step_order': get_latest_step_order()
}