我有帶有外鍵的標準 Django 模型。
Django 檔案:
“ForeignKey 由 django.forms.ModelChoiceField 表示,它是一個 ChoiceField,其選擇是一個模型 QuerySet。”
和
“如果模型欄位設定了選擇,則表單欄位的小部件將設定為選擇,選擇來自模型欄位的選擇。”
現在我有帶選項的下拉選單。
我不想要用戶可以看到選項的下拉選單。我想要用戶鍵入的 CharField(文本欄位或類似欄位),但仍然必須是該欄位的資料庫中的選項之一。他必須輸入有效的條目。
我試過:
class TransakcijeForm(forms.ModelForm):
model = models.Transakcije
fields = .....
labels = .....
widgets ={'subscriber':forms.TextInput()}
但我收到訊息:
“選擇一個有效的選擇。該選擇不是可用的選擇之一。” (輸入正確,可與下拉選單配合使用)
這是我在這里的第一個問題,如果我錯過了表格,我很抱歉。
uj5u.com熱心網友回復:
您收到該錯誤的原因是您的表單仍在將該subscriber欄位視為 a,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()更改表單以將欄位視為 aCharField而不是 a ModelChoiceField。這樣做會導致表單將subscriber欄位值作為字串回傳,因此您需要根據欄位的值獲取適當的模型物件。這就是該clean_subscriber(self)功能的用途。它需要命名為clean_<field name>(). 該函式將采用表單回傳的字串,嘗試找到正確的模型物件,如果找到物件則回傳它。如果它沒有找到匹配的物件,它將引發一個,ValidationError因此表單不會以錯誤的值提交。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/371716.html
