acer123
acer123

Reputation: 326

django form posting to another form

I am trying to create a form that feeds another form. The latest iteration is shown below. The flow is as follows:

A user selects a semester from both drop down lists on form1. When that page is POSTed the values from these drop down lists are used as a query filter for the next form that loads.

I have even tried storing this data in sessions but I just can't get anything to work. I have searched for answers but just can't find any. Most likely this is because I am new to Django and might not understand some of the information that I found.

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,})

Upvotes: 2

Views: 1678

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599610

You're doing things in the wrong order in your second view. You need to pass the values from the session into the form, and the form has to take the values from the 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,})

Upvotes: 2

Related Questions