我试图只为
Add页面创建第一个内联对象布尔字段
True
。
所以,我有
Person
模型和 Email
模型,它具有 Person
模型的外键,如下所示:
# "models.py"
class Person(models.Model):
name = models.CharField(max_length=20)
def __str__(self):
return self.name
class Email(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
is_used = models.BooleanField()
email = models.EmailField()
def __str__(self):
return self.email
然后,我在
EmailForm
中设置自定义表单form
为EmailInline()
如下图:
# "admin.py"
class EmailForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
kwargs['initial'] = {'is_used': True}
super().__init__(*args, **kwargs)
class EmailInline(admin.TabularInline):
model = Email
form = EmailForm # Here
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
inlines = (EmailInline,)
但是,所有内联对象在
Add页面默认是
is_used=True
如下图:
然后,我添加了一个主对象和一个内联对象,即
is_used=True
,如下所示:
但是,添加的内联对象和其他尚未添加的内联对象在
Change页面
is_used=True
如下所示:
然后,我添加了一个主对象和一个内联对象,即
is_used=False
,如下所示:
但是,添加的内联对象和其他尚未添加的内联对象在
Change页面
is_used=True
如下所示:
那么,我怎样才能使第一个内联对象布尔字段
True
默认仅用于Add页面?
您可以在
count
中使用全局变量__init__()
并覆盖get_formset()并在覆盖EmailForm
中将self.form
设置为get_formset()
,如下所示,仅使第一个内联对象布尔字段True
默认情况下仅适用于Add页面:
# "admin.py"
count = 0 # Here
class EmailForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
global count
if count < 1:
kwargs['initial'] = {'is_used': True}
count += 1
super().__init__(*args, **kwargs)
class EmailInline(admin.TabularInline):
model = Email
def get_formset(self, request, obj=None, **kwargs):
if not obj:
self.form = EmailForm
global count
count = 0
return super().get_formset(request, obj, **kwargs)
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
inlines = (EmailInline,)
然后,
Add页面默认只有第一个内联对象是
is_used=True
,如下图:
然后,我添加了一个主对象和一个内联对象,即
is_used=True
,如下所示:
然后,
Change页面上只有添加的内联对象
is_used=True
如下图:
然后,我添加了一个主对象和一个内联对象,即
is_used=False
,如下所示:
然后,添加的内联对象和其他尚未添加的内联对象在
变化页面
is_used=False
如下图:
另外,如果把
count < 1
改成count < 2
如下图:
# "admin.py"
count = 0
class EmailForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
global count
if count < 2: # Here
kwargs['initial'] = {'is_used': True}
count += 1
super().__init__(*args, **kwargs)
# ...
那么,在
Add页面中,第一个和第二个内联对象默认为
is_used=True
,如下所示: