问题描述
我正在尝试使用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 (将#修改为@)