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
,因此表单不会提交错误值。
我有带外键的标准 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
,因此表单不会提交错误值。