更改模型管理员表单默认值

时间:2012-06-21 18:36:43

标签: python django django-admin

我的项目中有典型的模型继承:

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)。

3 个答案:

答案 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()
        }