Django中如何通过邮件发送RichTextField的POST数据?
Django发送富文本邮件报错TemplateDoesNotExist解决指导
我希望通过邮件发送富文本字段(RichTextField)或HTML字段的POST数据,但代码无法实现,且出现TemplateDoesNotExist错误,请指导。
现有代码
models.py
class Servicereport(models.Model): name = models.CharField(max_length=255, blank=True, null=True) customer = models.ForeignKey(Customer, null=True, on_delete=models.SET_NULL) email = models.CharField(max_length=255, null=True, blank=True) report = RichTextField(default='<p><b>sample data .... </b>') class Customer(models.Model): name = models.CharField(max_length=255, null=True) last_name = models.CharField(blank=True, max_length=255, null=True) email = models.CharField(max_length=255, null=True)
forms.py
class ServicereportForm(ModelForm): class Meta: model = Servicereport fields = '__all__' widgets = { 'report': RichTextFormField() }
views.py
def createServicereport(request): form = ServicereportForm() if request.method == 'POST': form = ServicereportForm(request.POST) if form.is_valid(): subject = "SERVICE REPORT" html_message = render_to_string('report') message = EmailMessage(subject, html_message, 'from@email.com', [request.POST.get('email')]) message.content_subtype = 'html' message.send() form.save() return redirect('/') context = {'form': form} return render(request, 'service_report.html', context)
错误信息
TemplateDoesNotExist at /create_service_report/ report Request Method: POST Request URL: http://127.0.0.1:8000/create_service_report/ Django Version: 3.2.4 Exception Type: TemplateDoesNotExist Exception Value: report Exception Location: D:\development\website\venv\lib\site-packages\django\template\loader.py, line 19, in get_template Python Executable: D:\development\website\venv\Scripts\python.exe Python Version: 3.7.9
解决步骤
1. 修正render_to_string调用错误
错误核心是render_to_string('report')未指定完整模板文件名(如report.html),且未传递富文本内容到模板。修改views.py对应代码:
def createServicereport(request): form = ServicereportForm() if request.method == 'POST': form = ServicereportForm(request.POST) if form.is_valid(): subject = "SERVICE REPORT" # 传递表单验证后的富文本内容,指定完整模板文件名 html_message = render_to_string('email_report.html', { 'report_content': form.cleaned_data['report'] }) # 使用表单验证后的邮箱,比直接取POST更安全 recipient_email = form.cleaned_data['email'] message = EmailMessage(subject, html_message, 'from@email.com', [recipient_email]) message.content_subtype = 'html' message.send() form.save() return redirect('/') context = {'form': form} return render(request, 'service_report.html', context)
2. 创建邮件模板文件
在项目templates目录下新建email_report.html,内容可按需调整:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>服务报告</title> </head> <body> <h2>服务报告详情</h2> <!-- 用|safe过滤器确保HTML内容被正确渲染 --> {{ report_content|safe }} </body> </html>
3. 确认模板目录配置
检查settings.py的TEMPLATES配置,确保包含模板所在目录:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR / 'templates'], # 确保此处包含你的模板目录 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
4. 验证富文本组件配置
若使用第三方富文本组件(如django-ckeditor),需确认:
- 已执行
pip install django-ckeditor安装 settings.py的INSTALLED_APPS中添加了ckeditor- 媒体文件路径等相关配置已正确设置
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

