You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在使用Django Material Layout功能的CreateView中添加验证码

解决方案

你需要同时完成三个操作即可在保留原有Layout配置的前提下添加验证码字段:

  1. 把captcha追加到fields方法的返回列表中,让LayoutMixin将该字段纳入合法字段范围
  2. 在get_form方法中为生成的表单实例添加验证码字段定义
  3. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 03:21:01