2016-05-18 6 views
0

Ich habe eine App mit Mitarbeiterprofilen und kann für jedes Profil Sicherheitskurse hinzufügen. In der App habe ich ein Formular, das ModelChoiceField verwendet, um ausgewählte Werte aus der Datenbank zu erhalten. In der CreateView funktioniert es gut. Ich kann die Daten eingeben und den Kurs für das Profil auswählen und es der Datenbank hinzufügen. Aber das Problem, das ich habe, ist, wenn ich den Sicherheitskurs für das Profil aktualisiere. Wenn ich das Formular aktualisiere, aktualisiert es das "geleitete_Datum" und das "Ablaufdatum", aber das Auswahlformular wird nicht aktualisiert. Wenn ich das Aktualisierungsformular eintrage, wählt das Formular nicht einmal den Wert aus, den es z. B. hat:Formularfeldwert wird nicht aktualisiert, nachdem der Wert in UpdateView in Django geändert wurde.

Wenn ich ein Profil für "John Doe" habe und ich "course1" zu seinem Profil hinzugefügt habe, funktioniert das gut , aber wenn ich das Profil bearbeite, wird "Kurs1" nicht ausgewählt, sondern "Kurs2" wird ausgewählt. Wenn ich dann einen anderen Kurs wie "course3" wähle und "submit" drücke, wird das "conduced_date" und das "expiration_date" aktualisiert, aber nicht der Kurs. Was genau mache ich falsch oder was vermisse ich?

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

Ich habe auch versucht init in meinem forms.py Einstellung aber, dass entweder nicht funktioniert hat.

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

So zu wiederholen. Warum aktualisiert mein UpdateView nur die Felder "conduced_date" und "expiration_date", aber nicht das Feld "course" und warum hat das Feld select nicht den richtigen Formularwert im Bearbeitungsformular?

Hinweis: Wenn Sie weitere Informationen benötigen dann, lassen Sie es mich bitte wissen.

Antwort

3

Sie haben nicht angegeben, dass course ein Feld ist, das dem Modell zugeordnet ist. Die einzigen Felder, die gespeichert werden, sind conducted_date und expiration_date. Stellen Sie sicher, dass sich course auch in der Meta.fields-Liste befindet.

+0

Wow, das war einfach, aber ich war in der Nähe, ich versuchte eine Variation davon. Ich habe versucht, "course_id" in der Meta.fields-Liste zu verwenden, aber das hat nicht funktioniert und ich dachte nicht, einfach "Kurs" zu versuchen. Sehr geschätzt. Da funktioniert dann, dass auch "course_taken.course_id = form.data ['natürlich']" redundant in meiner AddSafetyCourseTakenView macht. – nastyn8