3

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

class A(models.Model):
    boolean_field = models.BooleanField(default=True)

class B(A):
    some_other_field = models.CharField()

我想覆盖boolean_fieldin class的默认值,B我该怎么做?

我认为在数据库层上做这件事可能很棘手,所以至少我可以简单地覆盖 Django admin 中的默认值(我的意思是在ModelAdmin表单中为 class B)。

4

3 回答 3

5

B正如您所建议的,我认为最简单的方法是在 django admin 中更改用于模型的模型表单。

要更改表单字段的初始值,您可以重新定义该字段,或覆盖该__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 管理员中使用您的自定义模型表单很容易!

class BAdmin(admin.ModelAdmin):
    form = BForm

admin.site.register(B, BAdmin)
于 2012-06-21T19:25:20.150 回答
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)
于 2012-06-21T18:59:13.560 回答
1

这个答案中,我发现最简单的方法是覆盖该函数get_changeform_initial_data

以下是我如何将它应用到我的项目中。

在这个例子中,我有一个叫做 ORM 的类Step和一个叫做 Admin 的类StepAdmin。该函数从表中的最新对象中获取get_latest_step_orderstep_order

通过覆盖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()
        }
于 2017-09-20T03:06:54.850 回答