Django ModelChoiceField с пользовательским набором вопросов не проходит валидацию
Мое поле ModelChoiceField не проходит проверку, говоря, что выбранный вариант не является экземпляром.
Я передаю пользовательский набор запросов моему modelChoiceField, который использует пользовательский менеджер (objects_sys) для возврата дополнительных записей, которые архивируются и не отображаются при обычных запросах. Записи отображаются, и я могу их выбрать, но когда форма публикуется и Django пытается проверить, он должен использовать другой запрос, который отфильтровывает архивные элементы, поэтому они не являются правильными вариантами выбора.
Я использую представления, основанные на классах - это не работает в form_valid()
Models:
class Item(models.Model):
name = UpperCaseCharField(max_length=10, primary_key=True)
description = models.CharField(max_length=200)
class ItemLoc(models.Model):
item = models.ForeignKey(Item, on_delete=models.PROTECT)
location = models.CharField(max_length=200)
Моя форма:
class ItemForm(forms.ModelForm):
class Meta:
model = ItemLoc
fields = (
'item',
'location'
)
def __init__(self, *args, **kwargs):
super(ItemForm, self).__init__(*args, **kwargs)
self.fields['item'].queryset = Items.objects_sys.filter(qty_on_hand__gt=0)
Нужно ли мне снова передать этот пользовательский запрос в ModelChoiceField в какой-то момент, чтобы дополнительные значения были доступны для валидации?
Спасибо за помощь
class ItemForm(forms.ModelForm):
class Meta:
model = ItemLoc
fields = (
'item',
'location'
)
def __init__(self, *args, **kwargs):
super(ItemForm, self).__init__(*args, **kwargs)
self.fields['item'].queryset = Item.objects_sys.filter(qty_on_hand__gt=0)
def clean(self):
cleaned_data = super().clean()
item = cleaned_data.get("item")
if item not in self.fields['item'].queryset:
raise forms.ValidationError("Invalid item")
Таким образом, в методе clean вы используете пользовательский набор queryset, который вы установили в методе init, чтобы проверить, является ли выбранный элемент действительным.