2017-01-14 2 views
1

Je dois enregistrer un nouvel enregistrement à partir de l'instance existante de formset en ligne. J'ai réussi à enregistrer une nouvelle instance à partir du modèle parent (Order), mais je ne peux pas comprendre comment enregistrer une nouvelle instance d'un formset. Le code est comme ceci:Enregistrement d'un nouvel enregistrement à partir de l'instance de formset

def order(request, date): 
    edit = Order.objects.get(date=date, user=None) 
    edit_formset = modelformset_factory(Order_items, fields='__all__', extra=0) 
    if request.method == 'POST': 
     form = OrderForm(request.POST, instance=edit) 
     formset = edit_formset(request.POST, queryset=Order_items.objects.filter(order__date=date)) 
     if form.is_valid(): 
      instance = form.save(commit=False) 
      instance.pk = None 
      instance.user_id = request.user.id 
      if formset.is_valid(): 
       form.save() 
       formset.save() 
      return HttpResponseRedirect('order') 
    else: 
     form = OrderForm(instance=edit) 
     formset = edit_formset(queryset=Order_items.objects.filter(order__date=date)) 
     return render(request, 'diner/order.html', {'edit': edit, 'form': form, 'formset': formset}) 
+0

Je ne sais pas ce que vous entendez par « une nouvelle instance d'un formset », le point d'un formset est qu'il contient de multiples formes. Mais quel est le problème avec le code que vous avez posé? Que fait-il que vous n'attendez pas, ou ne faites pas ce que vous attendez? Quelles erreurs obtenez-vous? –

+0

Je dois éditer l'enregistrement existant et en enregistrer un nouveau. Le problème est que le code enregistre un nouvel enregistrement de la table Order, mais n'en crée pas un nouveau dans Order_items. – ZmuA

+0

Vraisemblablement 'formset_is_valid()' est False, mais vous redirigez toujours dans ce cas. –

Répondre

0

D'accord, je suis venu à une solution:

if form.is_valid(): 
    form.cleaned_data['pk'] = None 
    if formset.is_valid(): 
      create_order = Order.objects.create(date=form.cleaned_data['date'], user_id=request.user.id) 
      new = formset.save(commit=False) 
      for n in new: 
       n.id = None 
       n.order_id = create_order.id 
       create_order.save() 
       n.save() 
0

Vous pouvez l'essayer.

if request.method == 'POST': 
    form = OrderForm(request.POST, instance=edit) 
    formset = edit_formset(request.POST) 
    If form.is_valid(): 
     instance = form.save(commit=False) 
     instance.pk = None 
     instance.user_id = request.user.id 
     form.save() 
     if formset.is_valid(): 
      add_new = formset.save(commit=False) 
      add_new.instance = instance 
      add_new.save() 
      return HttpResponseRedirect('order') 

Depuis tout demande de poste vous définissez l'instance dans formset = edit_formset (request.POST, instance = modifier) ​​ donc tout en économisant le formset il sauver le order_item pour l'ordre ancien que vous nommez comme « édition pas le premier. Et add_new.instance = instance aidera à créer la nouvelle instance formset.

+0

Ce n'est pas ça. Formset n'a pas d'attribut 'instance', donc il ne le fera pas. – ZmuA