Предельные значения в поле modelformset

Я пытался решить эту проблему уже пару дней, отчаявшись. Смотрите прокомментированные фрагменты кода для некоторых вещей, которые я пробовал, но не работал.

Проблема: Как ограничить значения в поле category IngredientForm только теми, которые принадлежат текущему пользователю?

enter image description here

views.py

@login_required
def apphome(request):
    IngrFormSet = modelformset_factory(Ingredient, extra=1, fields=('name', 'category'))

    # Attempt #1 (not working; error: 'IngredientFormFormSet' object has no attribute 'fields')
    # ingrformset = IngrFormSet(prefix='ingr', queryset=Ingredient.objects.none())
    # ingrformset.fields['category'].queryset = Category.objects.filter(user=request.user)

    # Attempt #2 (doesn't work)
    # ingrformset = IngrFormSet(prefix='ingr', queryset=Ingredient.objects.filter(category__user_id = request.user.id))

models.py:

class Category(models.Model):
    name = models.CharField(max_length=30, unique=True)
    user = models.ForeignKey(User, null=True, blank=True)       

class Ingredient(models.Model):
    name = models.CharField(max_length=30, unique=True)
    user = models.ForeignKey(User, null=True, blank=True)
    category = models.ForeignKey(Category, null=True, blank=True)
    counter = models.IntegerField(default=0)

forms.py:

class IngredientForm(ModelForm):
    class Meta:
        model = Ingredient 
        fields = ('name', 'category')

ОБНОВЛЕНИЕ: Я добился определенного прогресса, но решение в настоящее время жестко запрограммировано и не может быть использовано:

Я узнал, что могу управлять поле формы category через класс формы, а затем передать форму в виде следующим образом:

#forms.py
class IngredientForm(ModelForm):
    category = forms.ModelChoiceField(queryset = Category.objects.filter(user_id = 1))

    class Meta:
        model = Ingredient 
        fields = ('name', 'category')

#views.py
IngrFormSet = modelformset_factory(Ingredient, form = IngredientForm, extra=1, fields=('name', 'category'))

Приведенное выше дает результат, который мне нужен, но, очевидно, user является жестко запрограммированным. Мне нужно, чтобы он был динамическим (т.е. Текущим пользователем). Я попробовал некоторые решения для доступа к request.user в forms.py, но они не работали.

Любые идеи о том, как двигаться вперед?

Ответ 1

Вам не нужны какие-либо пользовательские формы. Вы можете изменить запрос в поле category следующим образом:

IngrFormSet = modelformset_factory(Ingredient, extra=1, fields=('name', 'category'))
IngrFormSet.form.base_fields['category'].queryset = Category.objects.filter(user__id=request.user.id)

Ответ 2

Category.objects.filter(user=request.user)

возвращает объект списка для начального значения в вашей форме, что мало смысла.

Попробуйте вместо этого

Category.objects.get(user=request.user)

или

Category.objects.filter(user=request.user)[0]