我是 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) ]
问题在于最后返回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)