如何在使用Django Material Layout功能的CreateView中添加验证码
解决方案
你需要同时完成三个操作即可在保留原有Layout配置的前提下添加验证码字段:
- 把
captcha追加到fields方法的返回列表中,让LayoutMixin将该字段纳入合法字段范围 - 在
get_form方法中为生成的表单实例添加验证码字段定义 - 在Layout配置中新增
captcha字段的渲染位置
单视图实现示例
from captcha.fields import ReCaptchaField from captcha.widgets import ReCaptchaV3 class OurModelCreateView(LayoutMixin, CreateView): model = OurModel layout = Layout( Row('field1', 'field2', 'field3'), Row(...), # 新增此行,可根据需求调整captcha的展示位置 'captcha' ) def fields(self): fields = super().fields() fields.append('captcha') return fields def get_form(self, form_class=None): form = super().get_form(form_class) form.fields['captcha'] = ReCaptchaField(widget=ReCaptchaV3) return form
多视图复用实现
如果有多个视图需要添加验证码,可封装为独立Mixin复用:
from captcha.fields import ReCaptchaField from captcha.widgets import ReCaptchaV3 class ReCaptchaV3Mixin: def fields(self): fields = super().fields() fields.append('captcha') return fields def get_form(self, form_class=None): form = super().get_form(form_class) form.fields['captcha'] = ReCaptchaField(widget=ReCaptchaV3) return form
使用时只需将该Mixin放在继承列表最前面即可:
class OurModelCreateView(ReCaptchaV3Mixin, LayoutMixin, CreateView): model = OurModel layout = Layout( Row('field1', 'field2', 'field3'), Row(...), 'captcha' )
原由说明
之前的尝试失败是因为只完成了部分操作:只添加字段定义没加到fields列表会被LayoutMixin拦截,只加fields列表没有定义字段类型则无法完成渲染和校验,两者配合加上Layout配置即可正常运行。
内容的提问来源于stack exchange,提问作者Dan Swain
相关产品推荐
相关产品推荐

