2016-04-08 6 views
1

Ich möchte ein neues Objekt herzustellen, sondern warten Eingangs Benutzer es zu erstellen:Django Klon Modellobjekt mit Klasse basiert Create

Ich habe get_form dieser Ansicht hinzugefügt:

class MyCreateView(CreateView): 

    def get_form(self, form_class): 
     form = super(MyCreateManView, self).get_form(form_class) 
     if self.kwargs['ref']: 
      new_item = get_object_or_404(models.MyModel, pk = self.kwargs['ref']) 
      new_item.pk = None 
      new_item.note = "Copia di " + new_item.note 
      form = MyForm(instance = new_item) 

    def form_valid(self, form): 
     ... 

Bei dem Verfahren Ich lese den GET-Parameter 'ref' und kompiliere die Formularfelder mit diesen Daten vor.

Aber wenn ich die Daten einreiche, wird die form_valid Methode nicht ausgeführt und das neue Objekt wird nicht erstellt.

+0

'if form.is_valid(): form = form.save(); context = { "Formular": Formular, }; Rendern Rendern (Anfrage, "app/template.html", Kontext) ' –

+2

Ist es eine klassenbasierte Ansicht oder eine normale Ansicht? Wenn es keine klassenbasierte Ansicht ist, macht 'super (MyCreateManView, self) .form_valid (form)' keinen Sinn. Hast du diesen Code von irgendwo anders und kopiert in Stücken? – AKS

Antwort

2

Wenn Sie das tun,

form = MyForm(instance = new_item) 

Sie sind unverbindlich das Formular nicht auf alle Daten. Dies bedeutet, dass das Formular niemals gültig sein wird.

Ich würde stattdessen get_form_kwargs überschreiben versuchen.

def get_form_kwargs(self): 
    kwargs = super(MyCreateView, self).get_form_kwargs() 
    if self.kwargs['ref']: 
     new_item = get_object_or_404(models.MyModel, pk = self.kwargs['ref']) 
     ... 
     kwargs['instance'] = new_item 
    return kwargs