如何在Django Admin中点击后禁用提交按钮
Django变更表单防止重复提交:提交后禁用按钮的简便方法
当然有,给你几种简便实用的方法,从简单到可靠分情况选择:
前端JS即时禁用(最简便)
直接在模板里给表单绑定提交事件,提交时立刻禁用按钮并修改提示文本,用户马上就能看到反馈,避免重复点击:<form method="post" id="change-form"> {% csrf_token %} {{ form.as_p }} <button type="submit" id="submit-btn">保存变更</button> </form> <script> const form = document.getElementById('change-form'); const submitBtn = document.getElementById('submit-btn'); form.addEventListener('submit', () => { submitBtn.disabled = true; submitBtn.textContent = '提交中...'; }); </script> 这种方法优点是零后端改动,即时生效;缺点是如果有人通过浏览器控制台解锁按钮,还是可能重复提交,适合普通场景。前端+后端token验证(更可靠)
要彻底防止重复提交,得前端禁用加后端验证配合。可以给表单加一个一次性UUID token,提交后后端标记该token已使用:- 先在表单类里添加token字段和验证逻辑:
from django import forms import uuid from django.core.cache import cache class YourChangeForm(forms.ModelForm): submit_token = forms.CharField(widget=forms.HiddenInput(), required=False) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['submit_token'].initial = str(uuid.uuid4()) def clean_submit_token(self): token = self.cleaned_data.get('submit_token') if cache.get(f'submit_token_{token}'): raise forms.ValidationError('请勿重复提交表单') cache.set(f'submit_token_{token}', 'used', timeout=300) # 5分钟后过期 return token- 模板里依然保留前端禁用的JS逻辑,后端会自动验证token,拦截重复提交。
配合视图缓存控制
另外可以给变更视图加上@never_cache装饰器,防止浏览器缓存表单页面,避免用户后退后再次提交:from django.views.decorators.cache import never_cache from django.views.generic.edit import UpdateView @never_cache class YourChangeView(UpdateView): model = YourModel form_class = YourChangeForm template_name = 'your_template.html' success_url = '/success/'
内容的提问来源于stack exchange,提问作者mohammad
相关产品推荐
相关产品推荐

