私は従業員プロファイルを持つアプリケーションを持っており、各プロファイルに安全コースを追加できます。このアプリケーションでは、ModelChoiceFieldを使用してデータベースから選択値を取得するフォームがあります。 CreateViewでうまく動作します。私は、日付を入力し、プロファイルのコースを選択し、データベースに追加することができます。しかし、私が抱えている問題は、プロファイルの安全コースを更新するときです。フォームを更新すると、 "carried_date"と "expiration_date"が更新されますが、選択フォームは更新されません。更新フォームに入力すると、フォームには現在の値が選択されません。たとえば、DjangoのUpdateViewで値を変更した後にフォームフィールドの値が更新されない
"John Doe"のプロフィールがあり、彼のプロフィールに「course1」を追加した場合、正常に動作しますしかし、プロフィールを編集するときは、「コース1」は選択されず、「コース2」が選択されます。そして、「course3」のような別のコースを選択してsubmitを押すと、「conducting_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は 'proceed_date'フィールドと 'expiration_date'フィールドのみを更新しますが、 'course'フィールドは更新しません。また、選択フィールドに編集フォームの適切なフォーム値がないのはなぜですか?
注:追加情報が必要な場合は、私にお知らせください。
うわーは簡単でしたが、私は近くにいましたが、私はその変形を試みました。私はMeta.fieldsのリストで "course_id"を使用しようとしましたが、それはうまくいかず、 "コース"を試してみるとは思わなかった。とても有難い。 それが動作するので、私のAddSafetyCourseTakenViewでは "course_taken.course_id = form.data ['course']"が冗長になります。 – nastyn8