如何只为 Django Admin 中的“添加”页面默认设置第一个内联对象布尔字段“True”?

问题描述 投票:0回答:1

我试图只为

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页面?

python django-models boolean django-admin default
1个回答
0
投票

您可以在

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,如下所示:

© www.soinside.com 2019 - 2024. All rights reserved.