Django:几次点击提交按钮=数据库中的几个条目

时间:2018-06-08 14:55:34

标签: django

我刚刚在表单提交按钮上快速点击几次,当它正在加载时。我的POST请求被多次发送,这意味着我可以创建多达10个数据库条目,它们应该只有一个。

直到现在我还没有意识到这一点,并想知道这是正常行为还是我的观点有问题?

def event_detail_view(request, event, organizer):

    queryset = Event.objects.filter(organizer__slug=organizer)
    event = get_object_or_404(queryset, slug=event)
    tickets = collect_all_tickets(event, organizer)
    ReserveFormSet = formset_factory(ReserveForm, formset=BaseReserveFormSet, extra=0)
    formset = ReserveFormSet(
        initial=tickets,
        form_kwargs={'organizer_slug': organizer}
        # Example [{'ticket': "Early Bird"}, {'ticket': "Regular Ticket"},]
    )
    if request.method == 'POST':
        formset = ReserveFormSet(
            request.POST,
            initial=tickets,
            form_kwargs={'organizer_slug': organizer}
        )
        if formset.is_valid():
            order_reference = unique_order_reference_generator()
            #  TODO Marc: Move into function
            for form in formset:
                ticket_name = form.cleaned_data['ticket'].name
                int_or_empty = form.cleaned_data['quantity']
                qty = is_int_or_zero(int_or_empty)
                if qty > 0:
                    obj = form.save(commit=False)
                    obj.ticket_name = ticket_name
                    obj.order_reference = order_reference
                    obj.save()
            return redirect('organizers:index', organizer=organizer)

    return render(request, 'events/event_detail.html', {'event': event, 'formset': formset})

1 个答案:

答案 0 :(得分:2)

这是正常行为,也是在线表单的常见问题。有解决方案可以解决这个问题,但它通常在前端完成,而不是在您的视图中。

您可能只想在点击后停用提交按钮。您可以使用各种方法执行此操作。以下是几个Javascript选项:

https://www.the-art-of-web.com/javascript/doublesubmit/

在这个答案中还有一个不错的jQuery版本:

Disabling the button after once click