2016-09-23 7 views
1

Das ist vielleicht eine einfache Frage, aber ich habe keine Ahnung, wie das geht. Ich habe zwei Modelle in Django.Auto-fill Django OneToOneField

class ModelA(models.Model): 
    some_member = models.Charfield(...) 

class ModelB(models.Model): 
    model = OneToOneField(ModelA) 
    other_member = models.Charfield(...) 

ModelA wird durch eine Modelform gefüllt und dann in für ModelB zum Formular umleiten. Wie kann ich die OneToOneField basierend auf dem vorherigen Formular Autofill. Vielen Dank für Ihre Hilfe.


ich es wie folgt jetzt tue

class ModelBView(CreateView): 
....... 
    def form_valid(self, form): 
     model_b = form.save(commit=False) 
     model_a_form = ModelAForm(self.request.POST) 
     model_b.model = model_a_form.save(commit=False) 
     model_b.save() 
     return super(ModelBView, self).form_valid(form) 

aber erhalten die Fehlermeldung: „... konnte nicht erstellt werden, weil die Daten nicht bestätigen.“

Also hier ist das Problem, ich kann einfach die Daten aus dem vorherigen Formular auf Anfrage.POST. Wie kann ich diese Daten bekommen?

Antwort

0

Vielleicht können Sie die Daten aus ModelForm für ModelA in request.session oder request.get speichern und zur nächsten Seite für ModelB umleiten, wo Sie die Daten für das Modellfeld in ModelB abrufen und dann füllen können.

+0

thx für die schnelle Antwort. Ich bin neu im Django. Wie kann ich die Daten speichern? – 5yn4x

0

Es hängt davon ab, was Sie genau wollen.

Wenn Sie das Feld in der zweiten Form automatisch ausfüllen möchten, können Sie das Schlüsselwortargument initial verwenden, wenn Sie das Formular für ModelB instanziieren (z. B. aus Ihrer Sicht); dies wie:

def my_view(request): 
    """ 
    Save data to ModelA and show the user the form for ModelB 
    """ 
    if request.method == 'POST': 
     # Save ModelA instance 
     model_a_form = ModelFormA(request.POST) 
     if model_a_form.is_valid(): 
      model_a_instance = model_a_form.save() 

      # Once saved, show the user the form for ModelB, prefilled 
      # with the result from the previous form 
      model_b_form = ModelFormB(initial={'model': model_a_instance}) 

      # etc. Render the page as usual 
     else: 
      # ... 
    elif request.method == 'GET': 
     # ... 

Wenn auf der anderen Seite, die Sie nicht ModelA in der zweiten Form als ein Feld angezeigt werden soll, sondern verknüpfen es nach wie vor auf die resultierende Instanz, Sie so etwas tun kann beim Umgang mit die Antwort der zweiten Form.

# ... instance of first model is saved in `model_a_instance` 

# Initiate an empty instance of ModelB, with the value of `model` field set to model_a_instance 
model_b_instance = ModelB(model=model_a_instance) 

# Provide it as an instance to your model form 
model_b_form = ModelFormB(request.POST, instance=model_b_instance) 

if model_b_form.is_valid(): 
    # Everything else should work fine. 

Hoffe, das hilft.

+0

Thx. Ich möchte die zweite machen. Das hilft sehr. Aber wie kann ich dies in einer CreateView-Klasse tun? – 5yn4x

+0

Sie müssen die Methoden 'get()' und 'post()' der Ansicht überschreiben und diese Logik hinzufügen. –

+0

Ich habe dies versucht, aber ich bekomme den Fehler "... konnte nicht erstellt werden, da die Daten nicht validiert". – 5yn4x

Verwandte Themen