首页 > 解决方案 > Django submit form when browser is refreshed for multiple form

问题描述

There is a lot of similar question. But my problem is slightly different.

In a view, I am using multiple forms, for that, I am using formset and normal form.here is my view:

class CreateInvoice(TemplateView):
template_name = 'product/create_invoice.html'
product_list = Product.objects.get_all_product()
ItemFormSet = formset_factory(ItemForm, formset=BaseItemFormSet, extra=0)

def get_context_data(self, **kwargs):
    if 'items' not in kwargs:
        kwargs['items'] = self.ItemFormSet()

    if 'order' not in kwargs:
        kwargs['order'] = OrderForm()

    kwargs['product_list'] = self.product_list

    return super().get_context_data(**kwargs)

def post(self, request):
    item_formset = self.ItemFormSet(request.POST)
    order_form = OrderForm(request.POST)
    if order_form.is_valid() and item_formset.is_valid():
        order = order_form.cleaned_data
        items = item_formset.cleaned_data
        order['sold_by'] = request.user
        order_id = Order.objects.crate_new_order(order=order, items=items)
        return HttpResponseRedirect(self.render_to_response(self.get_context_data(pos_invoice=generate_pos_invoice(), order_id=order_id)))
    else:
        return HttpResponseRedirect(self.render_to_response(self.get_context_data(items=item_formset, order=order_form,)))

If forms are not valid then I need to render the same page with error messages. If forms are valid then also need to render the same page with the HTML receipt string and the extra data.

But here the problem is if the browser is refreshed (like pres crtl+f5) then the same forms are submitted again. From googling I came to know that this problem is created for I am using render instead of a redirect. Here is the link of the question from where I came to know this: Django form submit again on refresh

Now the main problem If I am redirecting the page then I am losing the functionality that I want to have. Like, can't send error messages if forms are invalid and send extra data like receipt HTML page string if forms are valid.

Now I don't know how to solve this issue or suggest a better approach for doing that. Thanks in advance.

标签: javascripthtmldjangopython-3.xdjango-views

解决方案


推荐阅读