Django Admin:覆盖内联的初始值

时间:2016-07-20 18:37:32

标签: django django-admin

我的一个模型有一个默认值的字段,我很满意,但我希望管理员中的默认值不同。这是我实现这一目标的尝试:

models.py

from django.db import models


class Parent(models.Model):
    parent_field_1 = models.CharField(max_length=255)
    parent_field_2 = models.CharField(max_length=255, blank=True)

    class Meta:
        ordering = ('pk',)

    def __unicode__(self):
        return self.parent_field_1


class Child(models.Model):
    parent = models.ForeignKey(Parent)
    child_field_1 = models.CharField(max_length=255)
    child_field_2 = models.CharField(max_length=255, blank=True)
    child_field_3 = models.IntegerField(default=0)

    class Meta:
        ordering = ('pk',)
        verbose_name_plural = 'children'

    def __unicode__(self):
        return self.child_field_1

forms.py

from django import forms

from .models import Child


class ChildForm(forms.ModelForm):
    class Meta:
        model = Child
        fields = [
            'parent',
            'child_field_1',
            'child_field_2',
            'child_field_3',
        ]

    def __init__(self, *args, **kwargs):
        if 'instance' not in kwargs:
            initial = kwargs.get('initial', {})
            initial['child_field_3'] = '1'
            kwargs['initial'] = initial

        super(ChildForm, self).__init__(*args, **kwargs)

admin.py

from django.contrib import admin

from .forms import ChildForm
from .models import Parent, Child


class ChildInline(admin.StackedInline):
    model = Child
    form = ChildForm


class ParentAdmin(admin.ModelAdmin):
    inlines = [ChildInline]


class ChildAdmin(admin.ModelAdmin):
    form = ChildForm

admin.site.register(Parent, ParentAdmin)
admin.site.register(Child, ChildAdmin)

当我去添加一个孩子时," Child field 3"字段填充了" 1" (而不是模型" 0"的默认值),这就是我想要的。当我去编辑一个孩子时," Child field 3" field填充了数据库中的任何值,这也是我想要的。

当我去添加或编辑父母时,我遇到的问题就出现了。如果我尝试添加父级,我还需要填写所有子级内联表单。同样,如果我尝试编辑父级,我需要填写所有额外的子级内联表单。如果我评论ChildInline班级' form = ChildForm行,我得到了正确的行为,但当然,错误的默认值(" 0"而不是" 1")。如何获得正确的行为和正确的默认值?

1 个答案:

答案 0 :(得分:2)

您的字段是IntegerField。您必须将initial设置为整数。

当表单允许为空时(此处就是这种情况),full_cleandismissed if the form did not changehas_changed()changed_data的空虚决定。

字段更改由field.has_changed(initial, data)确定,其中数据通过field.to_python(value)传递,在IntegerField的情况下返回整数。另一方面,initial应该是正确的类型,并按照提供的方式保留。这会导致比较:has_changed = ('1' != 1),返回True,而您希望它返回False