我正在尝试创建一个可以提供另一种形式的表单。最新的迭代如下所示。流程如下:
用户从form1上的两个下拉列表中选择一个学期。 当该页面被POST时,这些下拉列表中的值将用作下一个加载表单的查询过滤器。
我甚至尝试将这些数据存储在会话中,但我无法获得任何工作。我已经搜索了答案,但却找不到任何答案。这很可能是因为我是Django的新手,可能不了解我发现的一些信息。
class CopyClassEnrollmentForm1(forms.Form):
original_semester=forms.ModelChoiceField(queryset=Semester.objects.filter(is_active=True))
new_semester=forms.ModelChoiceField(queryset=Semester.objects.filter(is_active=True))
class CopyClassEnrollmentForm2(forms.Form):
original_class = forms.ModelChoiceField(queryset=Schedule.objects.filter(), empty_label=None)
new_class = forms.ModelChoiceField(queryset=Schedule.objects.filter(), empty_label=None)
def __init__(self, request, *args, **kwargs):
super (CopyClassEnrollmentForm2,self).__init__(*args,**kwargs)
self.fields['original_class'].queryset = Schedule.objects.filter(semester=original_semester)
@staff_member_required
def copy_class_enrollment1(request):
form = CopyClassEnrollmentForm1(request.POST)
if request.method == 'POST' and form.is_valid():
request.session['original_semester'] = form.cleaned_data['original_semester']
request.session['new_semester'] = form.cleaned_data['new_semester']
return HttpResponseRedirect(reverse('copy_class_enrollment2'))
else:
form = CopyClassEnrollmentForm1()
return render(request, "school/admin/copy_class_enrollment1.html", { 'form': form,})
def copy_class_enrollment2(request):
form = CopyClassEnrollmentForm2(request.POST)
if request.method == 'POST' and form.is_valid():
original_semester = request.session['original_semester']
new_semester = request.session['new_semester']
original_semester = form.cleaned_data['original_semester']
new_semester = form.cleaned_data['new_semester']
else:
form = CopyClassEnrollmentForm2()
return render(request, "school/admin/copy_class_enrollment2.html", { 'form': form,})
答案 0 :(得分:2)
你在第二个视图中以错误的顺序做事。您需要将会话中的值传递到表单中,并且表单必须从kwargs中获取值:
class CopyClassEnrollmentForm2(forms.Form):
original_class = forms.ModelChoiceField(queryset=Schedule.objects.filter(), empty_label=None)
new_class = forms.ModelChoiceField(queryset=Schedule.objects.filter(), empty_label=None)
def __init__(self, *args, **kwargs):
original_semester = kwargs.pop('original_semester')
new_semester = kwargs.pop('new_semester')
super (CopyClassEnrollmentForm2,self).__init__(*args,**kwargs)
self.fields['original_class'].queryset = Schedule.objects.filter(semester=original_semester)
def copy_class_enrollment2(request):
original_semester = request.session['original_semester']
new_semester = request.session['new_semester']
if request.method == 'POST':
form = CopyClassEnrollmentForm2(request.POST, original_semester=original_semester, new_semester=new_semester)
if form.is_valid():
# do something
else:
form = CopyClassEnrollmentForm2(original_semester=original_semester, new_semester=new_semester)
return render(request, "school/admin/copy_class_enrollment2.html", { 'form': form,})