无法在 django admin 中以一种形式保存多个实例

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

我是 Django 新手,我正在尝试创建一个帐户表单,您可以在其中选择用户并检查所需的平台,并在帐户表中为检查了每个平台的用户创建一个帐户。 所以 : 我在 model.py 文件中有三个模型:用户、平台和账户

class User(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)

class Platform(models.Model):
    platform_name = models.CharField(max_length=255)
    platform_link = models.CharField(max_length=255)

class Account(models.Model):
    platform = models.ForeignKey(Platform, on_delete=models.PROTECT)
    user = models.ForeignKey(User, on_delete=models.PROTECT)

然后我创建了一个 AccountForm 类

class AccountForm(ModelForm):
    platforms = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple(), queryset=Platform.objects.all())

    class Meta:
        model: Account
        fields = ["user", "platforms"]
        widgets = {'platform': forms.HiddenInput()}

在admin.py中

class AccountAdmin(admin.ModelAdmin):
    list_display =  ["id", "platform", "user"]
    form = AccountForm
  
    
    def save_form(self, request: Any, form: Any, change: Any) -> Any:  
        platforms = form.cleaned_data["platforms"]
        if platforms:
            accounts_to_save = []
            for platform in platforms:
                account = form.save(commit=False)
                form.instance.platform = platform
                accounts_to_save.append(account)
            
            Account.objects.bulk_create(accounts_to_save)
        else:
            return super().save_form(request, form, change)
        return super().save_form(request, form, change)
    

我尝试迭代检查的平台并每次保存,但它一直保存仅包含平台列表中最后一个值的实例。因此,如果我们选择用户 2 并检查平台 1 和平台 2 >> 它会保存 [(用户 2, 平台 2) ,(用户 2, 平台 2) ] 而不是 [(用户 2, 平台 1) ,(用户 2, 平台2) ]

python django django-forms frameworks django-admin
1个回答
0
投票

问题在于最后返回super.save_form中发送的表单必须填写。 我最终迭代了我的平台并使用objects.create创建帐户,并将最后一个帐户保留为表单中发送的帐户,以便超级方法中发送的表单不为空而引发错误

    def save_form(self, request: Any, form: Any, change: Any) -> Any:  
        platforms = form.cleaned_data['platforms']
        if platforms:
            for p in platforms[:len(platforms)-1]:
                Account.objects.create( platform= p ,user=form.cleaned_data['user'])
            form.instance.platform = platforms[len(platforms)-1]
        return super().save_form(request, form, change)
    
© www.soinside.com 2019 - 2024. All rights reserved.