我正在尝试设置一个网站,其中包含一个只有一个可见字段的小表单:一个EmailField。我使用a python package来使用Google No CAPTCHA ReCATPCHA,我希望只有在用户正确提交表单3次后才会显示验证码(NoReCaptchaField)。
在我的views.py中,我将创建一个传递boolean needs_captcha 的表单,该表单将成为每个3个成功表单POST请求的True(这是正常工作)。
form = JoinForm(needs_captcha)
现在在我的forms.py中,我有以下代码:
class JoinForm(forms.ModelForm):
def __init__(self, needs_captcha, *args, **kwargs):
super(JoinForm, self).__init__(*args, **kwargs)
if needs_captcha:
self.captcha = NoReCaptchaField(gtag_attrs={'data-theme': 'light'})
print("captcha will be included")
else:
print("captcha won't be included")
# this is the only field that is actually filled by the user
email = forms.EmailField(max_length=128, help_text="Introduce la cuenta de gmail que tienes asociada a tu"
" dispositivo Android",
widget=forms.EmailInput(attrs={'class': "w-input email_input",
'placeholder': 'Tu cuenta de Google'}),
required=True)
.....
def clean(self):
.....
def clean_email(self):
.....
return email
class Meta:
model = InterestedUser
fields = ('email', 'name', 'subject', 'via', 'content',)
因为并非所有的JoinForm对象都应该包含该字段,我试图在 init 中添加字段,仅针对我为此特定请求创建的对象,但它只是不起作用,验证码不会出现。这种方法是否正确?
答案 0 :(得分:1)
根据我的经验,您无法在super()。 init ()之后添加新字段。并且字段在_init之前不存在。因此,要始终包含可选字段,然后在初始化后删除它们,如果不需要它们。
class JoinForm(forms.ModelForm):
captcha = NoReCaptchaField(gtag_attrs={'data-theme': 'light'})
class Meta:
model = InterestedUser
fields = ('email', 'name', 'subject', 'via', 'content',)
def __init__(self, needs_captcha, *args, **kwargs):
super().__init__(*args, **kwargs)
if not needs_captcha:
del self.fields['captcha']