Один из способов сделать это - переопределить метод init класса ModelForm и присоединить нужные поля к полям формы, например:
class SessionForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(SessionForm, self).__init__(*args, **kwargs)
self.fields['subject'].queryset = Subject.objects.all()
self.fields['topic'].queryset = Module.objects.none()
if 'subject' in self.data: # This will be checked when you are saving the form via a POST method
try:
subject_id = int(self.data.get('subject'))
self.fields['topic'].queryset = Module.objects.filter(subject_id=subject_id)
except:
# catch your errors here if the form contains invalid data
elif self.instance.pk:
self.fields['topic'].queryset = self.instance.subject.module_set
class Meta:
model = Session
fields = ['subject', 'topic', 'session_dt', 'grade_level', 'num_students']
Я думаю, что Subject
в качестве внешнего ключадля Session
имеет смысл в вашем случае, как Session
-> Subject
-> Module
.Кроме того, вам придется выполнять вызов AJAX, когда значение раскрывающегося объекта изменяется в вашей форме.Поэтому создайте отдельную функцию представления, сопоставьте ее с URL-адресом и внутри этой функции сделайте следующее:
def load_modules(request):
subject_id = request.GET.get('subject')
modules = Modules.objects.get(id=subject_id)
return render(request, `template name here`, {'modules': modules})