Form field value not updating after changing value in UpdateView in Django
<p>I have an app that has employee profiles and I can add safety courses for each profile. In the app I have a form that uses ModelChoiceField to get select values from the database. In the CreateView it works just fine. I can enter the dates and select the course for the profile and add it to the database. But the problem I'm having is when I update the safety course for the profile. When I update the form it updates the "conducted_date" and the "expiration_date", but the select form doesn't update. When I enter the update form the form doesn't even select the value that it currently has, for example: </p>

<p>If I have a profile for "John Doe" and I added "course1" to his profile, that works fine, but when I go to edit the profile, "course1" isn't selected but rather "course2" is selected. Then when I chose another course like "course3" and press submit, the "conducted_date" and "expiration_date" gets updated but not the course. So what exactly am I doing wrong or what am I missing?</p>

<p>forms.py</p>

<pre><code>class SafetyCourseTakenForm(forms.ModelForm):
    course = forms.ModelChoiceField(queryset=SafetyCourse.objects.all(), empty_label=None)

    class Meta:
        model = SafetyCoursesTaken
        fields = [
            'conducted_date',
            'expiration_date',
        ]
</code></pre>

<p>views.py</p>

<pre><code>class AddSafetyCourseTakenView(LoginRequiredMixin, SuccessMessageMixin, CreateView):
    login_url = reverse_lazy('users:login')
    form_class = SafetyCourseTakenForm
    template_name = 'ppm/forms/add-course-taken.html'
    success_url = reverse_lazy('ppm:manage-courses-taken')
    success_message = 'Safety course has been added to profile'

    def form_valid(self, form):
        course_taken = form.save(commit=False)
        course_taken.user = self.request.user
        course_taken.profile_id = self.kwargs['pk']
        course_taken.course_id = form.data['course']
        return super(AddSafetyCourseTakenView, self).form_valid(form)

    # override success_url to redirect to url with primary key
    def get_success_url(self):
        pk = self.kwargs['pk']
        return reverse('ppm:manage-courses-taken', kwargs={'pk': pk})


class UpdateSafetyCourseTakenView(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
    login_url = reverse_lazy('users:login')
    model = SafetyCoursesTaken
    form_class = SafetyCourseTakenForm
    template_name = 'ppm/forms/update-course-taken.html'
    success_url = reverse_lazy('ppm:manage-courses-taken')
    success_message = 'Safety course has been updated for profile'

    def get_success_url(self):
        profile = SafetyCoursesTaken.objects.get(id=self.kwargs['pk'])
        return reverse('ppm:manage-courses-taken', kwargs={'pk': profile.profile_id})
</code></pre>

<p>I've also tried setting <strong>init</strong> in my forms.py but that didn't work either.</p>

<pre><code>SafetyCourseTakenForm(forms.ModelForm):
...
...
    def __init__(self, *args, **kwargs):
        super(SafetyCourseTakenForm, self).__init__(*args, **kwargs)
        self.fields['course'].queryset = SafetyCourse.objects.all()
</code></pre>

<p>So to reiterate. Why is my UpdateView only updating the 'conducted_date' and 'expiration_date' fields but NOT the 'course' field and why doesn't the select field have the proper form value on the edit form?</p>

<p>Note: If you need more information then provided, please let me know.</p>