2016-05-18 11 views
0

私は従業員プロファイルを持つアプリケーションを持っており、各プロファイルに安全コースを追加できます。このアプリケーションでは、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'フィールドは更新しません。また、選択フィールドに編集フォームの適切なフォーム値がないのはなぜですか?

注:追加情報が必要な場合は、私にお知らせください。

答えて

3

courseは、モデルに関連付けられたフィールドであることを指定していません。保存される唯一のフィールドはconducted_dateexpiration_dateです。 courseがMeta.fieldsリストにも含まれていることを確認してください。

+0

うわーは簡単でしたが、私は近くにいましたが、私はその変形を試みました。私はMeta.fieldsのリストで "course_id"を使用しようとしましたが、それはうまくいかず、 "コース"を試してみるとは思わなかった。とても有難い。 それが動作するので、私のAddSafetyCourseTakenViewでは "course_taken.course_id = form.data ['course']"が冗長になります。 – nastyn8

関連する問題