Django自定义操作中间表单页无法提交问题排查
Django自定义审批表单提交后未执行逻辑问题
我在Django中为审批需求实现了自定义操作的中间表单页,但每次提交都会直接返回模型管理页面,未执行任何预设逻辑。怀疑表单提交未被识别,或是页面加载时误触发提交。
相关代码
forms.py
class ReviewRequestTemplate(forms.Form): emailtemplate = forms.CharField(widget=forms.Textarea, required=True) employers_email = forms.EmailField(required=True)
admin.py
class EmployerAdmin(TranslationAdmin): list_display = ('name', 'website', 'review_request_sent',) actions = ['request_review',] def request_review(self, request, queryset): context={} RequestTemplateFormset = formset_factory(ReviewRequestTemplate, extra=0) formset = RequestTemplateFormset(initial=[ {'emailtemplate': f'Hello {employer.name} Review our service right NOW!', 'employers_email':employer.email} for employer in queryset ]) if 'submit' in request.POST: print('YEES') formset = RequestTemplateFormset(request.POST) if formset.is_valid(): print("formset is valid") else: print('nooo') context['formset'] = formset context['selected_employers'] = queryset return render(request, 'admin/reviewrequest.html', context)
admin/reviewrequest.html
{%extends "admin/base_site.html" %} {% block content %} <form action="" method="post" name="requestreviewform"> {% csrf_token %} <input type="checkbox" value="check" name="check"> do you want to send? {%for form in formset%} {{form.as_p}} {%endfor%} <input type="submit" name="request_review" value="Send request/s"> </form> {% endblock %}
问题原因及解决方法
1. 提交按钮标识不匹配
视图里判断的是'submit' in request.POST,但模板中提交按钮的name属性是request_review,导致永远触发不了逻辑分支,直接返回表单页面,而Django Admin会默认跳转回列表页。
修正方式:把admin.py中的判断条件改成匹配提交按钮的name:
# 原代码 if 'submit' in request.POST: # 修改为 if 'request_review' in request.POST:
2. 缺失Admin Action必要参数
Django Admin的自定义Action需要特定的隐藏字段来识别请求类型,否则会被当作普通列表页请求处理,直接跳转回去。
修正方式:在模板的表单中,{% csrf_token %}后添加两个隐藏字段:
<input type="hidden" name="action" value="request_review"> <input type="hidden" name="post" value="yes">
3. 补充逻辑执行后的跳转(可选)
当表单验证通过后,需要添加业务逻辑(比如发送邮件),然后跳转回列表页并提示成功:
if formset.is_valid(): print("formset is valid") # 执行发送邮件等业务逻辑 for form, employer in zip(formset, queryset): template = form.cleaned_data['emailtemplate'] email = form.cleaned_data['employers_email'] # 这里写发送邮件的代码 print(f"准备发送邮件到 {email},内容:{template}") # 提示成功并跳转回列表页 self.message_user(request, "审核请求已成功发送") return HttpResponseRedirect(request.path)
内容的提问来源于stack exchange,提问作者viciousvegs
相关产品推荐
相关产品推荐

