在Django中的UpdateView中更改值后,表单字段值不会更新

时间:2016-05-18 18:01:46

标签: python django django-forms django-views

我有一个拥有员工档案的应用程序,我可以为每个档案添加安全课程。在应用程序中,我有一个使用ModelChoiceField从数据库中获取选择值的表单。在CreateView中它工作得很好。我可以输入日期并选择配置文件的课程并将其添加到数据库中。但我遇到的问题是当我更新配置文件的安全课程时。当我更新表单时,它会更新“guided_date”和“expiration_date”,但是选择表单不会更新。当我输入更新表单时,表单甚至不会选择它当前具有的值,例如:

如果我有“John Doe”的个人资料并且我在他的个人资料中添加了“course1”,那就可以了,但是当我去编辑个人资料时,未选择“course1”而是选择“course2” 。然后,当我选择“course3”之类的其他课程并按提交时,“guided_date”和“expiration_date”会更新,但不会更新课程。那我到底做错了什么或者我错过了什么?

forms.py

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

    class Meta:
        model = SafetyCoursesTaken
        fields = [
            'conducted_date',
            'expiration_date',
        ]

views.py

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

我也尝试在我的forms.py中设置 init ,但这也不起作用。

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

重申一下。为什么我的UpdateView只更新'guided_date'和'expiration_date'字段,而不是'course'字段,为什么select字段在编辑表单上没有正确的表单值?

注意:如果您需要更多信息,请告知我们。

1 个答案:

答案 0 :(得分:3)

您尚未指定course是与模型关联的字段;唯一要保存的字段是conducted_dateexpiration_date。确保course也在Meta.fields列表中。