Администратор Django говорит: Выберите правильный вариант. Этот вариант не является одним из доступных.

У меня есть 2 модели django - основная (продукт) и связанные детали (PhysicalProperty - это ссылка «многие ко многим» через дополнительную модель ProductMetricals).

В основной модели Product я написал приемник post_save, в котором детально проверяю и очищаю данные.

Если я попробую

  Product.save()

от IDLE работает нормально.

Но если я изменю и сохраню основной продукт в форме администратора, у меня будет исключение.

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

введите описание изображения здесь

Я пытался отладить это, но стали понятия не имею - почему администратор вызывает исключение?

Вот код

models.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")

admin.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 ()


person Y.N    schedule 07.05.2014    source источник
comment
ты как-то решил это?   -  person andilabs    schedule 09.01.2015
comment
Нет. Я нахожу это только в интерфейсе администратора, и мне он не нужен для производства, поэтому проблема игнорируется :(   -  person Y.N    schedule 11.01.2015
comment
вы определили варианты выбора в моделях?   -  person Muhammad Taqi    schedule 23.03.2015
comment
показать код модели, в котором вы определяете поле для этого   -  person Muhammad Taqi    schedule 23.03.2015


Ответы (1)


Ваша проблема заключается в вашей post_save ловушке Product. Когда вы сохраняете Product в своем ProductAdmin, вызывается save_model(), а затем save_related(). Это, в свою очередь, вызывает save_formset с набором форм для ProductMetricals, который содержит ключ к ProductMetricals, который теперь удален. Теперь он недействителен (так как вы удалили его при сохранении Product).

Я столкнулся с аналогичной проблемой при удалении на встроенном, который был связан с другим встроенным в представлении администратора. В итоге я установил on_delete=models.SET_NULL для своих отношений внешнего ключа, поскольку по умолчанию каскад Django удаляется. Другой вариант - вручную переопределить набор форм.

Это похоже на то, что обсуждалось в ошибке № 11830.

person mattste    schedule 04.06.2015