使用django-recpatcha和django-crispy-forms发送电子邮件时出现问题

问题描述

我正在尝试使用django-recaptcha应用和django-crispy-forms在客户网站上建立联系表格。我的表单数据未在POST上传is_valid(),因此无法解决。任何帮助将不胜感激! (在Windows 10上使用python 3.8.5运行Django 3.11。)据我所知,我已经根据规范设置了所有配置。

这是 models.py

from django.db import models

class ContactEmail(models.Model):
    created = models.DateTimeField(auto_Now_add=True)
    first_name = models.CharField(blank=False,max_length=50)
    last_name = models.CharField(blank=False,max_length=50)
    email = models.EmailField(blank=False)
    phone = models.CharField(max_length=32,blank=True)
    subject = models.CharField(blank=False,max_length=80)
    message = models.TextField(blank=False)

    def __str__(self):
        return "{} {}: {} ({})".format(
            self.first_name,self.last_name,self.subject,self.created.strftime("%m/%d/%Y,%H:%M:%s UTC")
        )

forms.py

from django import forms
from django.urls import reverse

from .models import ContactEmail

from captcha.fields import ReCaptchaField
from captcha.widgets import ReCaptchaV3
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit


class ContactForm(forms.ModelForm):

    captcha = ReCaptchaField(widget=ReCaptchaV3(attrs={
        'data-theme': 'dark','data-size': 'compact'
    }))

    class Meta:
        model = ContactEmail
        fields = [
            'first_name','last_name','email','phone','subject','message',]

    def __init__(self,*args,**kwargs):
        super(ContactForm,self).__init__(*args,**kwargs)
        self.fields['captcha'].label = False
        self.helper = FormHelper()
        self.helper.add_input(Submit('submit','Submit',css_class='btn-block'))
        self.helper.form_method = 'POST'
        self.helper.form_action = reverse('contact')

views.py

import datetime

from django.contrib import messages
from django.core.mail import send_mail
from django.http import HttpResponse
from django.shortcuts import redirect,render
from django.template.loader import render_to_string
from django.urls import resolve
from django.utils.html import strip_tags

from .forms import ContactForm
from .models import ContactEmail

def add_Now():
    Now = datetime.datetime.Now()
    return Now

# ...

def contact(request):
    context = {
        'form': ContactForm(),}
    context['Now'] = add_Now()

    if request.method == 'GET':
        return render(
            request,template_name='website/contact.html',context=context
        )
    elif request.method == 'POST':
        form = ContactForm(request.POST)

        if form.is_valid():
            first_name = form.cleaned_data.get('first_name')
            last_name = form.cleaned_data.get('last_name')
            email = form.cleaned_data.get('email')
            phone = form.cleaned_data.get('phone')
            subject = form.cleaned_data.get('subject')
            message = form.cleaned_data.get('message')

            html_message = render_to_string(template_name='website/email.html',context={
                'first_name': first_name,'last_name': last_name,'email': email,'phone': phone,'subject': subject,'message': message,})
            plain_message = strip_tags(html_message)

            recipients = ['*** (my email address,for testing)',]

            try:
                send_mail(
                    subject,plain_message,'*** (client email address)',recipients,html_message=html_message
                )
                contact_email = ContactEmail(
                    first_name=first_name,last_name=last_name,email=email,phone=phone,subject=subject,message=message
                )
                contact_email.save()
                print("Message was sent and saved.")
                messages.add_message(request,messages.SUCCESS,'Your email was sent.')
            except Exception as e:
                messages.add_message(request,messages.ERROR,'Your email was not sent: {}'.format(e))
            finally:
                return redirect('contact')

        else:
            return redirect('contact')

contact.html

{% extends 'website/base.html' %}

{% load static %}
{% load crispy_forms_tags %}

{% block description %}{% endblock %}
{% block title %}Contact{% endblock %}

{% block content %}
<div class="col-md-6 offset-md-3 mb-5">
    {% crispy form form.helper %}
</div>
{% endblock %}

email.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <Meta charset="utf-8">
    </head>
    <body>
        Name: {{ first_name }} {{ last_name }}<br>
        Email: {{ email }}<br>
        {% if phone %}Phone: {{ phone }}<br>{% endif %}
        Subject: {{ subject }}<br><br>
        Message:<br>
        {{ message }}<br>
    </body>
</html>

还有我的 requirements.txt

asgiref==3.2.10
astroid==2.4.2
beautifulsoup4==4.9.1
colorama==0.4.3
dj-database-url==0.5.0
Django==3.1.1
django-bootstrap4==2.2.0
django-crispy-forms==1.9.2
django-recaptcha==2.0.6
gunicorn==20.0.4
isort==5.5.3
lazy-object-proxy==1.4.3
mccabe==0.6.1
psycopg2==2.8.6
pylint==2.6.0
pytz==2020.1
six==1.15.0
soupsieve==2.0.1
sqlparse==0.3.1
toml==0.10.1
whitenoise==5.2.0
wrapt==1.12.1

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...