我刚刚在表单提交按钮上快速点击几次,当它正在加载时。我的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})
答案 0 :(得分:2)
这是正常行为,也是在线表单的常见问题。有解决方案可以解决这个问题,但它通常在前端完成,而不是在您的视图中。
您可能只想在点击后停用提交按钮。您可以使用各种方法执行此操作。以下是几个Javascript选项:
https://www.the-art-of-web.com/javascript/doublesubmit/
在这个答案中还有一个不错的jQuery版本: