当前位置: 首页 > 知识库问答 >
问题:

Django forms.py电子邮件和电话验证

郭俊拔
2023-03-14
from django import forms
from django.core.validators import EmailValidator
from django.core.exceptions import ValidationError
from django.core.validators import validate_email
​
class ContactForm(forms.Form):
    contact_name = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control', 'autocomplete':'off'}), required=True)
    contact_email = forms.EmailField(error_messages={'invalid': 'This is my email error msg.'}, widget=forms.TextInput(attrs={'class':'form-control', 'autocomplete':'off'}), required=True)
    contact_subject = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control', 'autocomplete':'off'}), required=True)
    contact_phone = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control', 'autocomplete':'off'}), required=True)
    content = forms.CharField(
    required=True,
    widget=forms.Textarea(attrs={'class':'form-control', 'autocomplete':'off'})
    )
​
    # the new bit we're adding
    def __init__(self, *args, **kwargs):
        super(ContactForm, self).__init__(*args, **kwargs)
        self.fields['contact_name'].label = "Full Name:"
        self.fields['contact_email'].label = "Email:"
        self.fields['contact_subject'].label = "Subject:"
        self.fields['contact_phone'].label = "Phone:"
        self.fields['content'].label = "Message:"
​
    def clean_email(self):
        email = self.cleaned_data['contact_email']
        validator = RegexValidator("^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$")
        validator(email)
        return email
def contact(request):
    form_class = ContactForm
​
    # new logic!
    if request.method == 'POST':
        form = form_class(data=request.POST)
​
        if form.is_valid():
​
            recaptcha_response = request.POST.get('g-recaptcha-response')
            url = 'https://www.google.com/recaptcha/api/siteverify'
            payload = {
                'secret': settings.GOOGLE_RECAPTCHA_SECRET_KEY,
                'response': recaptcha_response
            }
            data = urllib.parse.urlencode(payload).encode()
            req = urllib.request.Request(url, data=data)

            response = urllib.request.urlopen(req)
            result = json.loads(response.read().decode())

            print('result:' + str(result))
​
            print('recaptcha_response:' + str(recaptcha_response))
​
            print('result_success:' + str(result['success']))

​
​
            if (not result['success']) or (not result['action'] == 'contact'):
                messages.error(request, 'Invalid reCAPTCHA. Please try again.')
​
            contact_name = request.POST.get(
                'contact_name'
            , '')
            contact_subject = request.POST.get(
                'contact_subject'
            , '')
            contact_email = request.POST.get(
                'contact_email'
            , '')
            contact_phone = request.POST.get(
                'contact_phone'
            , '')
            form_content = request.POST.get('content', '')
​
            # Email the profile with the
            # contact information
            template = get_template('contact_template.txt')
            context = {
                'contact_name': contact_name,
                'contact_email': contact_email,
                'contact_subject': contact_subject,
                'contact_phone': contact_phone,
                'form_content': form_content,
            }
            content = template.render(context)
​
            email = EmailMessage(
                contact_subject,
                content,
                "Your website" +'',
                ['email@gmail.com'],
                headers = {'Reply-To': contact_email }
            )
            email.send()
            messages.info(request, "Your message was sent successfully. Thank you for reaching out.")
​
    return render(request, 'contact.html', {
        'form': form_class,
    })
<form id='cform' action="#" method="post">
    {% csrf_token %}
    {{ form.as_p }}

    <script src='https://www.google.com/recaptcha/api.js?render=<KEY>'></script>
    <div class="g-recaptcha" data-sitekey="<KEY>"></div>
    <script>
        grecaptcha.ready(function() {
            grecaptcha.execute('<KEY>', {action: 'contact'})
            .then(function(token) {
                ginput = document.createElement('input');
                ginput.type = "hidden";
                ginput.name = "g-recaptcha-response";
                ginput.value = token;
                document.getElementById("cform").appendChild(ginput);
            });
        });
    </script>
    <button type="submit" class="btn btn-primary form-control">Submit</button>
</form>

如果不使用JavaScript,那么仅使用Django如何做到这一点呢?

共有1个答案

郜玉石
2023-03-14

您可以使用emailvalidator而不是regexvalidator。这样,您就不需要编写能够可靠地测试电子邮件地址的regex(这很难正确)。

为了验证电话号码,我将使用phonenumbers库。https://github.com/daviddrysdale/python-phonenumbers

更新

对于电子邮件字段,您试图做的一切都由Defualt处理。这样就够了:

class ContactForm(forms.Form):
    contact_email = forms.EmailField()

对于电话号码,您可以参考https://docs.djangoproject.com/en/3.0/ref/forms/validation/和phonenumbers文档编写自己的验证器。类似于:

from django.core.exceptions import ValidationError
import phonenumbers

def validate_phone_number(value):
    z = phonenumbers.parse(value, None)
    if not phonenumbers.is_valid_number(z):
        raise ValidationError(
            _('%(value) is not a valid phone number'),
            params={'value': value},
        )

然后

contact_phone = models.CharField(validators=[validate_phone_number])
 类似资料:
  • 我正在开发一个门户/移动应用程序,用户需要在注册过程中提供电子邮件id和电话号码。如果用户选择在系统中创建用户id,我将使用Congnito用户池进行身份验证。Cognito具有验证此类用户的电话号码/邮件id的功能。 如果他们选择使用他们的facebook/领英ID登录,Cognito中没有方法来验证电子邮件-d/电话号码。 如何验证联合身份用户的电子邮件/电话号码?

  • 每当我在Firebase中使用电子邮件/密码身份验证提供程序时,提供程序都会在成功注册时发送一个无记名令牌,即使是。是否有一种开箱即用的方法将电子邮件/密码身份验证提供程序配置为在用户验证其电子邮件地址之前不发送无记名令牌(并返回403错误)? 请注意,我知道如何创建用户、登录用户、发送验证电子邮件等。。。使用firebase v9。x通过firebase/auth中的方法创建用户(使用Email

  • 问题内容: 我有这个EditText定义: 注意,EditText具有使用电子邮件地址规范定义的inputType。Android是否内置任何可验证电子邮件地址输入类型的内容,还是都必须手动完成?它允许我输入无效数据,所以我对它的用途感到好奇。 谢谢。 问题答案: 在这里,通过输入电子邮件类型,您可以将电子邮件类型的键盘设置为“ @”和“。”。关键字将显示在键盘上。 更好的解决方案是通过以下功能比

  • 我是Firebase的菜鸟。我要求一种设置电子邮件验证的分步指南。 目前,我的应用程序使用基本电子邮件密码登录。我希望对用户进行验证,以便根据用户的电子邮件验证属性隐藏内容。我正在调用.sendEmailVerification(),它会发送到当前用户的电子邮件,但是,每当我单击电子邮件中的链接时,它都说该链接已过期或有人已使用它,这也不会更改属性。我怀疑这与api管理器有关。我目前已将我的网站托

  • 我有一张登记表,上面有姓名、电子邮件和密码。注册时,会向用户的电子邮件地址发送一个确认链接。但在发送链接之前,我需要验证电子邮件地址。我使用了: 它显示的任何电子邮件都有效,例如, 我从获得的电子邮件并将其存储在中。 我到底要怎么做才能让它成功?