Django: MultiChoiceField не показывает сохраненные варианты, добавленные после создания

В настоящее время я пытаюсь создать динамическую модель продукта, которая позволит администраторам добавлять свои собственные "наборы опций" к продуктам.

Например, продукт А имеет клапан с шириной 400 мм, 500 мм и 600 мм.

Для этого я создал 3 модели.

models.py

# A container that can hold multiple ProductOptions
class ProductOptionSet(models.Model):
    title = models.CharField(max_length=20)

# A string containing the for the various options available.
class ProductOption(models.Model):
    value = models.CharField(max_length=255)
    option_set = models.ForeignKey(ProductOptionSet)

# The actual product type
class HeadwallProduct(Product):
   dimension_a = models.IntegerField(null=True, blank=True)
   dimension_b = models.IntegerField(null=True, blank=True)

# (...more variables...)
   flap_valve = models.CharField(blank=True, max_length=255, null=True)

... и форма...

forms.py

class HeadwallVariationForm(forms.ModelForm):
    flap_valve = forms.MultipleChoiceField(required=False, widget=forms.SelectMultiple)

    def __init__(self, *args, **kwargs):
        super(HeadwallVariationForm, self).__init__(*args, **kwargs)
        self.fields['flap_valve'].choices = [(t.id, t.value) for t in ProductOption.objects.filter(option_set=1)]

    def save(self, commit=True):
        instance = super(HeadwallVariationForm, self).save(commit=commit)
        return instance

    class Meta:  
        fields = '__all__'
        model = HeadwallProduct

Это прекрасно работает во время первоначального создания продукта. Список из MultipleChoiceForm заполняется записями из ProductOptionSet, и форму можно сохранить.

Однако, когда администратор добавляет 700-миллиметровый клапан в качестве опции к ProductOptionSet of Product, вещи распадаются. Любые новые параметры будут отображаться в административной области существующего продукта - и даже будут сохраняться в базе данных при сохранении продукта - но они не будут отображаться, как выбранные в административной области.

Если продукт B создан, новые опции работают как задумано, но вы не можете добавить новые опции к существующему продукту.

Почему это происходит и что я могу сделать, чтобы это исправить? Благодарю.

1 ответ

Ух... через 4 часа я разобрался...

Изменение:

class ProductOption(models.Model):
    value = models.CharField(max_length=20)
    option_set = models.ForeignKey(ProductOptionSet)

в

class ProductOption(models.Model):
    option_value = models.CharField(max_length=20)
    option_set = models.ForeignKey(ProductOptionSet)

Исправлена ​​моя проблема.

Другие вопросы по тегам