2017-05-22 2 views
0

Ich habe ein Modell, das zusätzliche Informationen hat, die ich an den Benutzer anfügen muss, wenn sie Teil einer bestimmten Gruppe sind. Ich habe eine einfache CreateView erstellt, um diese Arbeit zu testen. Leider speichert es nicht alle Informationen im zweiten Modell. Dies ist das erste Mal, dass ich betterforms nutze, und ich folgte den Dokumenten. Es sieht jedoch so aus, als würde ich etwas vermissen. Hier ist meine aktuellen Code:Django MultiModelForms nicht speichern im zweiten Modell

Forms.py:

# Operator Creation Form 
class OperatorProfileForm(forms.ModelForm): 
    class Meta: 
     model = OperatorProfile 
     fields = ('cdl', 'endorsement', 'cdl_expiration') 


class UserCreationMultiForm(MultiModelForm): 
    form_classes = { 
     'user': UserCreationForm, 
     'profile': OperatorProfileForm, 
    } 

    # Save the user first, because the profile needs a user before it 
    # can be saved. 
    def save(self, commit=True): 
     objects = super(UserCreationMultiForm, self).save(commit=False) 

     if commit: 
      user = objects['user'] 
      user.save() 
      profile = objects['profile'] 
      profile.user = user 
      profile.save() 

     return objects 

Views.py:

class IndexView(TemplateView): 
    template_name = 'pages/index.html' 


class OperatorCreateView(CreateView): 
    model = OperatorProfile 
    template_name = 'pages/operatorprofile_form.html' 
    form_class = UserCreationMultiForm 
    success_url = reverse_lazy('index') 

Models.py:

class CDL(models.Model): 
    cdl_type = models.CharField(max_length=10) 
    description = models.TextField(max_length=255, blank=True) 

    def __str__(self): 
     return self.cdl_type 


class Endorsement(models.Model): 
    endorsement_type = models.CharField(max_length=10) 
    description = models.TextField(max_length=255, blank=True) 

    def __str__(self): 
     return self.endorsement_type 


class OperatorProfile(models.Model): 
    user = models.ForeignKey('auth.User', on_delete=models.CASCADE) 
    cdl = models.ManyToManyField('CDL') 
    endorsement = models.ManyToManyField('Endorsement') 
    cdl_expiration = models.DateField(default=timezone.now) 

    def __str__(self): 
     return str(self.user) 

Momentan werden die ForeignKeys nicht im OperatorProfile-Modell gespeichert, aber die anderen Einstellungen werden problemlos gespeichert. Jede Eingabe würde sehr geschätzt werden.

Antwort

0

Nun ... ich bin ein Idiot. Ich habe save_m2m() vergessen. Hier ist die Lösung für Leute, die sich wundern.

forms.py:

# Operator Creation Form 
class OperatorProfileForm(forms.ModelForm): 
    class Meta: 
     model = OperatorProfile 
     fields = ('cdl', 'endorsement', 'cdl_expiration') 


class UserCreationMultiForm(MultiModelForm): 
    form_classes = { 
     'user': UserCreationForm, 
     'profile': OperatorProfileForm, 
    } 

Views.py:

class IndexView(TemplateView): 
    template_name = 'pages/index.html' 


class OperatorCreateView(CreateView): 
    model = OperatorProfile 
    template_name = 'pages/operatorprofile_form.html' 
    form_class = UserCreationMultiForm 
    success_url = reverse_lazy('index') 

    def form_valid(self, form): 
     # Save the user first, because the profile needs a user before it 
     # can be saved. 
     user = form['user'].save() 
     profile = form['profile'].save(commit=False) 
     profile.user = user 
     profile.save() 
     form['profile'].save_m2m() 
     return redirect(reverse_lazy('index')) 
Verwandte Themen