Why does my django form with recaptcha send data even empty the recaptcha?

194 views
Skip to first unread message

Sergei Sokov

unread,
Mar 11, 2021, 3:40:22 PM3/11/21
to Django users
I put the google recaptcha V2 to my django project form. It looks like working, but if I leave empty the recaptcha checkbox my form is sent still.

forms.py

from django import
forms from captcha.fields
import ReCaptchaField
from django.forms import Textarea
from .models import *
class CustomerForm(forms.ModelForm):
    captcha = ReCaptchaField( public_key='key', private_key='key', )
    class Meta:
        model = Customer fields = '__all__'
    def __init__(self, *args, **kwargs):
        # get 'user' param from kwargs
        user = kwargs.pop('user', None)
        super().__init__(*args, **kwargs)
        self.fields['message'].widget = Textarea(attrs={'rows': 4})
        self.fields['i_have_read_rules'].widget.attrs['required'] = 'True'
        self.fields['i_agree'].widget.attrs['required'] = 'True'
        self.fields['captcha'].widget.attrs['required'] = 'True'
        for field in self.fields:
            self.fields[field].widget.attrs['class'] = 'form-control'
        self.fields['i_have_read_rules'].widget.attrs['class'] = 'form-check'
        self.fields['i_agree'].widget.attrs['class'] = 'form-check'

html

                <form id="add_form_order" method="post">
                    {% csrf_token %}
                    <h6 class="block-title">Выберите услугу</h6>
                    <div class="form-group">{{form.choice_services}}</div>
                    <div class="form-group">{{form.name}}</div>
                    <div class="form-group">{{form.telephone_number}}</div>
                    <div class="form-group">{{form.email}}</div>
                    <div class="form-group">{{form.message}}</div>
                    <div class="form-group">{{form.contact_text}}</div>
                                                                 {{ form.captcha }}
                </form>

Gabriel Araya Garcia

unread,
Mar 11, 2021, 3:50:26 PM3/11/21
to django...@googlegroups.com
Camarada Sokov:
Your code is very difficult to understand at first sight. I did not know about ReCaptchaField().
But, is interesting to learn something new.

Recards,

Gabriel Araya Garcia
GMI - Desarrollo de Sistemas Informáticos
from Santiago de Chile



--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/e18dcba2-07e2-44d9-ace6-744a2bb69234n%40googlegroups.com.

Chetan Ganji

unread,
Mar 12, 2021, 8:06:56 PM3/12/21
to django...@googlegroups.com
Remove below line and try again

self.fields['captcha'].widget.attrs['required'] = 'True'


If the problem persists, try some js or jquery validation in frontend





Sergei Sokov

unread,
Mar 13, 2021, 8:58:27 AM3/13/21
to Django users
html

        <form id="add_form_order" method="post">
            {% csrf_token %}
            <div class="form-group">{{form.choice_services}}</div>
            <div class="form-group">{{form.name}}</div>
            <div class="form-group">{{form.telephone_number}}</div>
            <div class="form-group">{{form.email}}</div>
            <div class="form-group">{{form.message}}</div>
            <div class="form-group">{{form.contact_text}}</div>
                                    {{ form.captcha }}
    
        </form>


    <!--recaptcha-->
    <script>
    window.onload = function() {
        var $recaptcha = document.querySelector('#g-recaptcha-response');
    
        if($recaptcha) {
            $recaptcha.setAttribute("required", "required");
        }
      const $form = document.querySelector('form');
      $form.addEventListener('submit', (event) => {
        event.preventDefault();
        console.log('prevented submit by code for demo');
      });
    };
    </script>

css

    #g-recaptcha-response {
        display: block !important;
        position: absolute;
        margin: -78px 0 0 0 !important;
        width: 302px !important;
        height: 76px !important;
        z-index: -999999;
        opacity: 0;
    }

пятница, 12 марта 2021 г. в 21:06:56 UTC+1, RyuCoder:
Reply all
Reply to author
Forward
0 new messages