我有一个拥有员工档案的应用程序,我可以为每个档案添加安全课程。在应用程序中,我有一个使用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字段在编辑表单上没有正确的表单值?
注意:如果您需要更多信息,请告知我们。
答案 0 :(得分:3)
您尚未指定course
是与模型关联的字段;唯一要保存的字段是conducted_date
和expiration_date
。确保course
也在Meta.fields列表中。