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, чтобы форма не отправилась с неверным значением.

Вернуться на верх