Мое небольшое дополнение,
У меня было требование, когда одно из полей выбора модели формы зависит от request.user
, и мне потребовалось некоторое время, чтобы обдумать.
Идея в том, что
вам необходим метод __init__
в классе формы модели,
и вы получаете доступ к request
или другим параметрам из аргументов метода __init__
,
- тогда вам нужно вызвать супер-конструктор, чтобы обновить класс формы
- и затем вы устанавливаете
queryset
обязательного поля
пример кода
class CsvUploadForm(forms.Form):
def __init__(self, *args, **kwargs):
user = kwargs.pop('user')
super(CsvUploadForm, self).__init__(*args, **kwargs)
self.fields['lists'].queryset = List.objects.filter(user=user)
lists = forms.ModelChoiceField(queryset=None, widget=forms.Select, required=True)
Как вы можете видеть, переменная lists
зависит от текущего пользователя, который доступен через объект request
, поэтому мы устанавливаем queryset
поля как нулевое, и его динамически назначается из конструктора позже ,
Взгляните на порядок операторов в приведенном выше коде
вы можете передать пользовательскую переменную из файла вида
form = CsvUploadForm(user=request.user)
или с другими данными POST, FILE, как показано ниже
form = CsvUploadForm(request.POST, request.FILES, user=request.user)