Как изменить queryset в форме?

В Django формы представляются с помощью класса Form или его наследников. Когда форма сохраняется, ее данные проходят через процесс валидации, где происходит проверка на соответствие заданным правилам валидации. В процессе валидации формы также можно изменить queryset.

Чтобы изменить queryset в форме, можно воспользоваться методом __init__ класса формы. В этом методе можно получить доступ к полям формы и изменить queryset перед рендерингом формы.

Вот пример, как изменить queryset в форме для модели Book и поля author:

from django import forms
from .models import Book

class BookForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        
        # Изменяем queryset
        self.fields['author'].queryset = Author.objects.filter(active=True)

    class Meta:
        model = Book
        fields = ['title', 'author', 'genre']

В данном примере мы переопределяем метод __init__ формы BookForm, вызывая сначала родительский метод __init__, а затем изменяем queryset поля author.

Если вы хотите изменить queryset в зависимости от контекста или других данных, вы можете передать дополнительные параметры в конструктор формы и использовать их для изменения queryset.

from django import forms

class BookForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        author_queryset = kwargs.pop('author_queryset', None)
        super().__init__(*args, **kwargs)
        
        # Изменяем queryset, используя переданный author_queryset
        self.fields['author'].queryset = author_queryset

    class Meta:
        model = Book
        fields = ['title', 'author', 'genre']

В этом случае вы можете передать author_queryset при создании экземпляра формы и использовать его для изменения queryset. Пример использования:

author_queryset = Author.objects.filter(active=True)
form = BookForm(author_queryset=author_queryset)

Таким образом, вы можете изменять queryset полей формы в Django, чтобы кастомизировать выбор доступных значений. Это может быть полезно, когда вам нужно ограничить или динамически изменить список значений, которые пользователь может выбрать.