我的一个模型有一个默认值的字段,我很满意,但我希望管理员中的默认值不同。这是我实现这一目标的尝试:
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
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)
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")。如何获得正确的行为和正确的默认值?
答案 0 :(得分:2)
您的字段是IntegerField
。您必须将initial
设置为整数。
当表单允许为空时(此处就是这种情况),full_clean
为dismissed if the form did not change。 has_changed()
由changed_data
的空虚决定。
字段更改由field.has_changed(initial, data)
确定,其中数据通过field.to_python(value)
传递,在IntegerField
的情况下返回整数。另一方面,initial
应该是正确的类型,并按照提供的方式保留。这会导致比较:has_changed = ('1' != 1)
,返回True
,而您希望它返回False
。