反馈表单 Django
反馈表单 Django
我终于被反馈表单困扰了。结果,它对我有用,但它只在项目的独立页面上工作,我需要在网站的每个页面中实现它,以便与其他内容一起显示。这不是我第一次遇到这样的问题;我无法在同一页面上显示多个模型。
在独立页面上实现的方法如下:
views.py:
def contact(request): form_class = ContactForm if request.method == 'POST': form = form_class(data=request.POST) if form.is_valid(): contact_name = request.POST.get( 'contact_name' , '') contact_email = request.POST.get( 'contact_email' , '') form_content = request.POST.get('content', '') # 邮件发送给带有 # 联系信息的收件人 template = get_template('app/contact/contact_template.txt') context = { 'contact_name': contact_name, 'contact_email': contact_email, 'form_content': form_content, } content = template.render(context) email = EmailMessage( "New contact form submission", content, '', ['mail@mailer.com'], headers = {'Reply-To': contact_email } ) email.send() return redirect('contact') return render(request, 'app/contact.html', { 'form': form_class, })
在 urls.py中:
... path('contact/', views.contact, name='contact'), ...
contact.html:
联系我们
forms.py:
class ContactForm(forms.Form): contact_name = forms.CharField(required=True) contact_email = forms.EmailField(required=True) content = forms.CharField( required=True, widget=forms.Textarea ) # 添加的新部分 def __init__(self, *args, **kwargs): super(ContactForm, self).__init__(*args, **kwargs) self.fields['contact_name'].label = "您的姓名:" self.fields['contact_email'].label = "您的邮箱:" self.fields['content'].label = "您想说什么?"
也许有更好的解决方案,让表单在每个页面上都能工作吗?
问题的原因是需要在每个页面中将表单模型添加到上下文中,但是当表单响应时,需要能够处理该响应的视图。解决方法之一是在基本模板中包含一个JavaScript文件,该文件通过Ajax get请求获取表单数据,然后通过Ajax post请求将表单数据发送回视图中的方法。这样,您就不需要修改任何视图,但是Django将无法以相同的方式构建表单。另一种方法是将联系表单类添加到要放置表单的页面的上下文中,并在页面中插入HTML模板,使用with
语句将父HTML中的上下文传递给模板。但是,这不会在表单尝试提交时起作用,因为除非更改表单的操作,否则它将尝试将其提交到呈现它的视图的URL。因此,您可能需要找到一种在不将用户从表单所在的页面重定向的情况下使表单提交到所需URL的方法。另外,建议将变量名从"form"重命名为"contact_form",以避免与其他内容混淆。