J'ai besoin de sauvegarder un nouvel enregistrement de l'instance de sortie de formset en ligne. J'ai réussi à enregistrer une nouvelle instance à partir du modèle parent (Order), mais je n'arrive pas à comprendre comment enregistrer une nouvelle instance d'un formset. Le code est comme ceci:

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})
1
ZmuA 14 janv. 2017 à 12:59

2 réponses

Meilleure réponse

D'accord, j'ai trouvé 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
ZmuA 2 févr. 2017 à 12:36

Vous pouvez essayer ça.

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

Étant donné que pendant la demande de publication, vous définissez l'instance dans formset = edit_formset (request.POST, instance = edit) , tout en enregistrant le formset, il enregistre l'élément order_item pour l'ancienne commande que vous nommez comme "modifier" non pour le nouveau. Et add_new.instance = instance aidera à créer la nouvelle instance formset.

0
Ashish 14 janv. 2017 à 11:42