向Django Forms添加每个3 POST请求的字段

时间:2015-02-19 15:52:00

标签: django django-forms

我正在尝试设置一个网站,其中包含一个只有一个可见字段的小表单:一个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 中添加字段,仅针对我为此特定请求创建的对象,但它只是不起作用,验证码不会出现。这种方法是否正确?

1 个答案:

答案 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']