Проблема Django ModelMultipleChoiceField для сохранения данных в БД
Раньше в моей форме было поле выбора нескольких значений, заполненное списком JSON.
формы.py
FRUIT_CHOICES= [
('Oranges', 'Oranges'),
('Cantaloupes', 'Cantaloupes'),
('Mangoes', 'Mangoes'),
('Honeydews', 'Honeydews')
]
class AddRecordForm(forms.ModelForm):
testrever = forms.MultipleChoiceField(choices=FRUIT_CHOICES)
Итак, я использовал поле JSON в своем файле models.py вот так:
модели.py
class Record(models.Model):
testrever = models.JSONField(max_length=500)
Это сработало как чудо, и я смог сохранить выделение и загрузить его обратно при вызове формы.
Но теперь вforms.py
мне нужно изменитьforms.MultipleChoiceField
кforms.ModelMultipleChoiceField
который заполняется таким набором запросов
class AddRecordForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.storage_pk = kwargs.pop('pk')
super(AddRecordForm, self).__init__(*args, **kwargs)
self.fields['testrever'].queryset = BDC.objects.filter(ref=self.storage_pk).values_list('model', flat=True)
testrever = forms.ModelMultipleChoiceField(widget=forms.widgets.SelectMultiple, queryset=None)
class Meta:
model = Record
exclude = ("user",)
fields = ['id','first_name','last_name','email', 'phone' ,'address', 'city' ,'state' ,'zipcode' ,'regarde' ,'testrever']
Итак, теперь мойmodels.JSONField
in больше не работает, поскольку я больше не отображаю формат списка JSON.
Какое поле мне следует использовать в
models.py
чтобы заставить его снова работать?
1 ответ
Если вы выбираете ноль, один или несколько элементов другой модели, вы используете
ManyToManyField
[Djangp-док]:
class Fruit(models.Model):
name = models.CharField(max_length=128, unique=True)
def __str__(self):
return name
class Record(models.Model):
testrever = models.ManyToManyField(Fruit, blank=True)
При этом также используетсяModelMultipleChoice
поле как поле формы по умолчанию. Так что вам нужно всего лишь подключить другой виджет:
class RecordForm(forms.ModelForm):
class Meta:
model = Record
fields = '__all__'
widgets = {'testrever': forms.SelectMultiple}
хотя в настоящее время большинство баз данных предлагают поле JSON, которое полезно для неструктурированных данных, для структурированных данных с использованиемJSONField
это не очень хорошая идея, поскольку она нарушает первую нормальную форму [вики].