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

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