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)
Исправлена моя проблема.