Django ForeignKey,对下拉菜单中的用户 select 选项隐藏

Django ForeignKey, hide from user select options in dropdown menu

我有带外键的标准 Django 模型。

Django 文档:

“ForeignKey 由 django.forms.ModelChoiceField 表示,它是一个 ChoiceField,其选择是一个模型 QuerySet。”

“如果模型字段设置了选项,则表单字段的小部件将设置为 Select,选择来自模型字段的选项。”

现在我有带选项的下拉菜单。

我不想要用户可以看到选项的下拉菜单。我想要用户输入的 CharField(文本字段或类似的),但仍然 那必须是数据库中该字段的选项之一。他必须输入有效条目。

我试过了:

class TransakcijeForm(forms.ModelForm):
    model = models.Transakcije
    fields = .....
    labels = .....
    widgets ={'subscriber':forms.TextInput()}

但我收到消息:

"Select 一个有效的选择。该选择不是可用的选择之一。" (输入正确且适用于下拉菜单)

这是我的第一个问题,如果我错过了表格,我很抱歉。

您收到该错误的原因是因为您的表单仍在将 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。这样做会导致表单将 return subscriber 字段值作为字符串,因此您将需要根据字段值获取适当的模型对象。这就是 clean_subscriber(self) 函数的用途。它需要命名为 clean_<field name>()。该函数将采用由表单 return 编辑的字符串,尝试找到正确的模型对象,如果找到对象,则 return 它。如果找不到匹配的对象,它将引发 ValidationError,因此表单不会提交错误值。