Django 管理员说:选择一个有效的选择。该选择不是可用的选择之一

Y.N*_*Y.N 5 python django django-models django-admin python-idle

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

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

如果我尝试

  Product.save()
Run Code Online (Sandbox Code Playgroud)

从 IDLE 开始,它工作正常。

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

Select a valid choice. That choice is not one of the available choices
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我尝试调试它,但 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")
Run Code Online (Sandbox Code Playgroud)

管理员.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)
Run Code Online (Sandbox Code Playgroud)

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

例外(我认为)来自ProductMetricals.objects.filter( Product = instance ).delete()

mat*_*ste 2

你的问题在于你post_save对Product. Product当您在您的 中保存 a 时ProductAdmin,save_model()会调用 and then save_related()。这反过来又调用save_formset一个表单集,该表单集包含现在已删除的ProductMetricalsa 的键。ProductMetricals它现在无效(因为您在保存时删除了它Product)。

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

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