反馈表单 Django

27 浏览
0 Comments

反馈表单 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:

联系我们

{% csrf_token %} {{ form.as_p }}

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 =
            "您想说什么?"

也许有更好的解决方案,让表单在每个页面上都能工作吗?

0
0 Comments

问题的原因是需要在每个页面中将表单模型添加到上下文中,但是当表单响应时,需要能够处理该响应的视图。解决方法之一是在基本模板中包含一个JavaScript文件,该文件通过Ajax get请求获取表单数据,然后通过Ajax post请求将表单数据发送回视图中的方法。这样,您就不需要修改任何视图,但是Django将无法以相同的方式构建表单。另一种方法是将联系表单类添加到要放置表单的页面的上下文中,并在页面中插入HTML模板,使用with语句将父HTML中的上下文传递给模板。但是,这不会在表单尝试提交时起作用,因为除非更改表单的操作,否则它将尝试将其提交到呈现它的视图的URL。因此,您可能需要找到一种在不将用户从表单所在的页面重定向的情况下使表单提交到所需URL的方法。另外,建议将变量名从"form"重命名为"contact_form",以避免与其他内容混淆。

0
0 Comments

问题原因:在Django中一切看起来都没问题,可能是HTML代码中出现了错误的链接或其他问题。

解决方法:检查HTML代码中的链接或其他错误。

0
0 Comments

问题的原因是在模板中引入了一个名为"blog/_layouts/contact.html"的文件,但是在页面上只显示了

在这里,你需要使用你的urls中的app_name值来替换app_name。

至于在页面内部显示发送成功的消息,你可以使用Ajax来实现。这个问题可以作为一个新的问题提出。

0