Django ForeignKey, скрытие от пользователя опций выбора в выпадающем меню
У меня есть стандартные модели Django с ForeignKey.
Django docs:
"ForeignKey представлен django.forms.ModelChoiceField, который является ChoiceField, чьи варианты выбора являются модельным QuerySet."
и
"Если в поле модели установлены варианты выбора, то виджет поля формы будет установлен на Select, при этом варианты выбора будут взяты из вариантов поля модели."
Теперь у меня есть выпадающее меню с вариантами выбора.
Мне не нужно выпадающее меню, где пользователь может видеть варианты. Я хочу CharField (текстовое поле или подобное), где пользователь вводит значение, но при этом это должен быть один из вариантов из базы данных для этого поля. Он должен набрать правильную запись.
Я пытался:
class TransakcijeForm(forms.ModelForm):
model = models.Transakcije
fields = .....
labels = .....
widgets ={'subscriber':forms.TextInput()}
но я получаю сообщение:
"Выберите правильный выбор. Этот выбор не является одним из доступных вариантов." (запись правильная и работает с выпадающим меню)
Это мой первый вопрос здесь, и я извиняюсь, если я пропустил форму.
Причина, по которой вы получаете эту ошибку, заключается в том, что ваша форма все еще рассматривает поле subscriber
как ModelChoiceField
, потому что вы переопределяете только виджет, отображаемый в html. Вам нужно изменить фактический тип вашего поля. Вы можете определить вашу форму следующим образом:
from django.core.exceptions import ValidationError
class TransakcijeForm(forms.ModelForm):
subscriber = forms.CharField()
class Meta:
model = models.Transakcije
fields = ....
labels = ....
def clean_subscriber(self):
subscriber_id = self.cleaned_data['subscriber']
try:
# adjust this line to appropriately get the model object that you need
subscriber = SubscriberModel.objects.get(id=subscriber_id)
return subscriber
except:
raise ValidationError('Subscriber does not exist')
Строка subscriber = forms.CharField()
изменит форму так, что поле будет рассматриваться как CharField
, а не как ModelChoiceField
. Это приведет к тому, что форма вернет значение поля subscriber
в виде строки, поэтому вам нужно будет получить соответствующий объект модели на основе значения поля. Для этого и предназначена функция clean_subscriber(self)
. Она должна быть названа как clean_<field name>()
. Эта функция возьмет строку, возвращаемую формой, попытается найти нужный объект модели и вернет его, если объект будет найден. Если она не найдет ни одного подходящего объекта, то выдаст сообщение ValidationError
, чтобы форма не отправилась с неверным значением.