python - Django - 将联系表格添加到页脚
问题描述
我正在尝试创建一个可以在我的应用程序的所有页面上使用的联系表单。
我的函数contact_form(request)
在context_processors.py
我的基本模板扩展到的所有模板中成功显示了联系表单,但问题是我无法提交信息并使用它运行 POST 请求。
经过广泛的研究,似乎唯一干净的方法是context_processors.py
执行 GET 请求并让自定义模板标签处理 POST 请求。
采用这种方法,我找不到在模板标签中处理它的方法。我尝试了几种不同的方法,并得到了几个不同的错误。为了达到这一点,我还查看了许多帖子,包括页脚中的 Contactform ,似乎没有任何答案可以显示模板中的格式。
设置.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
...
'services.context_processors.contact_form',
],
},
},
]
context_processors.py
from .forms import ContactForm
def contact_form(request):
if request.method == 'GET':
contact_form = ContactForm()
return {'contact_form': contact_form}
return
标签.py
@register.inclusion_tag('services/headerfooter.html', takes_context=True)
def post_request(context):
request = context['request']
if request.method == 'POST':
contact_form = ContactForm(request.POST)
if contact_form.is_valid():
from_email = contact_form.cleaned_data['from_email']
message = contact_form.cleaned_data['message']
try:
send_mail(subject, message, from_email, ['t19clar@gmail.com'])
except BadHeaderError:
return HttpResponse('Invalid header found.')
context = {
'contact_form': contact_form,
'from_email': from_email,
'message': message
}
return render(request, 'services/headerfooter.html', context)
headerfooter.html
{% load tags %}
<form method="post">
<div class="messages"></div>
<div class="controls">
<div class="form-group">
{% csrf_token %}
{{ contact_form.as_p }}
{% post_request %}
</div>
<input type="submit" class="btn btn-outline-light" value="Send message">
</div>
</form>
解决方案
我弄清楚我的问题是什么。由于我的大部分视图都使用基于类的视图,因此我需要添加一个单独的post()
方法来处理 POST 请求,如下所示。基于函数的视图不需要这样做。在弄清楚这一点后,我放弃了模板标签并将所有逻辑添加到context_processor.py
.
视图.py
class HomeView(TemplateView):
template_name = 'services/home.html'
def post(self, request):
return render(request, self.template_name)
context_processors.py
def contact_form(request):
if request.method == 'GET':
contact_form = ContactForm()
context = {'contact_form': contact_form}
else:
contact_form = ContactForm(request.POST)
if contact_form.is_valid():
from_email = contact_form.cleaned_data['from_email']
message = contact_form.cleaned_data['message']
try:
send_mail(subject, message, from_email, ['t19clar@gmail.com'])
except BadHeaderError:
return HttpResponse('Invalid header found.')
context = {
'contact_form': contact_form,
'from_email': from_email,
'message': message
}
return context
推荐阅读
- javascript - Javascript 前端和 Python 后端之间的计时器延迟故障排除
- php - MySQL 查询显示没有结果
- c# - 语音识别程序随机显示预定义的单词(在'GramarBuilder()'中定义),用于那些语法中不存在的口语单词
- mysql - mysql 安装程序 8.0.11 网络社区拒绝初始化数据库
- swift - 无法将图片 url 从 FirebaseStorage 下载到 FirebaseDatabase - Swift - metadata.downloadURL() 不再被识别
- ios - 从 XIB 加载自定义视图始终在堆栈视图内保持相同的帧
- php - php __get 魔法方法
- elasticsearch - 每小时汇总文件价值
- ionic-framework - 有什么方法可以在苹果设备上显示我在 IONIC 中制作的应用程序?
- javascript - Javascript - 获取文本区域中的所有网址