Нет, запрос не передается в ModelForm. Вы должны сделать что-то вроде этого в своем представлении:
form = BookSubmitForm()
form.fields['book'].queryset = Book.objects.filter(owner=request.user)
# pass form to template, etc
Как вы сказали, часто бывает проще инкапсулировать это в объект Form, особенно если у вас есть несколько полей, которые потребуют отфильтрованных запросов. Чтобы сделать это, переопределите формы __init__()
и пусть он принимает kwarg request
:
class BookSubmitForm(ModelForm):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop("request")
super(BookSubmitForm, self).__init__(*args, **kwargs)
self.fields["book"].queryset = Book.objects.filter(owner=self.request.user)
self.fields["whatever"].queryset = WhateverModel.objects.filter(user=self.request.user)
Затем просто передавайте запрос всякий раз, когда вы создаете экземпляр BookSubmitForm
в своем представлении:
def book_submit(request):
if request.method == "POST":
form = BookSubmitForm(request.POST, request=request)
# do whatever
else:
form = BookSubmitForm(request=request)
# render form, etc