gpt4 book ai didi

python - Django 管理员说 : Select a valid choice. That choice is not one of the available choices

转载 作者:行者123 更新时间:2023-11-28 18:43:11 29 4
gpt4 key购买 nike

我有 2 个 Django 模型——主要(产品)和链接的详细信息(PhysicalProperty 是通过附加模型 ProductMetricals 的多对多链接)。

在主模型 Product 中,我编写了 post_save 接收器,我在其中详细检查和清理数据。

如果我尝试

  Product.save()

从 IDLE 开始,它工作正常。

但是,如果我在管理表单中更改并保存主要产品,则会出现异常

Select a valid choice. That choice is not one of the available choices

enter image description here

我尝试调试它,但 steel 不知道 - 为什么管理员会引发异常?

代码如下

模型.py

from django.db import models

# Create your models here.

class PhysicalProperty(models.Model):
shortname = models.CharField(max_length=255)
def __str__(self):
return self.shortname

class Product(models.Model):
shortname = models.CharField(max_length=255)

product_metricals = models.ManyToManyField( PhysicalProperty, through = 'ProductMetricals' )

def __str__(self):
return self.shortname

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=Product)
def product_post_save(sender, instance, **kwargs):
ProductMetricals.objects.filter( product = instance ).delete()

class ProductMetricals(models.Model):
amount=models.FloatField()
product=models.ForeignKey( Product )
physicalproperty = models.ForeignKey(PhysicalProperty )

class Meta:
unique_together = ("product", "physicalproperty")

管理员.py

from django.contrib import admin

# Register your models here.

from product.models import Product, ProductMetricals, PhysicalProperty

from django import forms

class PhysicalPropertyAdmin(admin.ModelAdmin):
list_display = ['shortname']

admin.site.register(PhysicalProperty, PhysicalPropertyAdmin)

class ProductMetricalsInline(admin.TabularInline):
model = ProductMetricals
fieldsets = [
(None, {'fields': ['physicalproperty','amount']}),
]
extra = 2

class ProductAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['shortname']}),
]
inlines = [ProductMetricalsInline]
list_display = ['shortname']

admin.site.register(Product, ProductAdmin)

如果我创建一些属性,创建产品,向产品添加一个属性,然后更改产品名称并保存它 - 我遇到了异常

异常来自(我认为)来自 ProductMetricals.objects.filter( product = instance ).delete()

最佳答案

您的问题出在 Product 上的 post_save 钩子(Hook)上。当您在 ProductAdmin 中保存一个 Product 时,将调用 save_model(),然后调用 save_related()。这反过来调用 save_formset,其中包含 ProductMetricals 的表单集,其中包含现在已删除的 ProductMetricals 的键。它现在无效(因为您在 Product 上保存时删除了它)。

我在删除与管理 View 中另一个内联有关系的内联时遇到了类似的问题。我最终为我的外键关系设置了 on_delete=models.SET_NULL,因为默认情况下 Django 级联删除。另一种选择是手动覆盖表单集。

它看起来与 bug #11830 中讨论的内容相似

关于python - Django 管理员说 : Select a valid choice. That choice is not one of the available choices,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23521938/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com