首页 > 解决方案 > 反馈表 Django

问题描述

我终于被反馈表折磨了。结果,它对我有用,但它只适用于项目的单独页面,我需要在站点的每个页面中实现它,以便它与其余内容一起显示。这不是我第一次遇到这样的问题;我无法在一页上同时显示多个模型。

在单独页面的情况下如何实现:

视图.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', '')

            # Email the profile with the
            # contact information
            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'),
...

联系人.html

<h1>Contact</h1>
<form role="form" action="" method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Submit</button>
</form>

表格.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
    )

    # the new bit we're adding
    def __init__(self, *args, **kwargs):
        super(ContactForm, self).__init__(*args, **kwargs)
        self.fields['contact_name'].label = "Your name:"
        self.fields['contact_email'].label = "Your email:"
        self.fields['content'].label =
            "What do you want to say?"

也许有一些更好的解决方案可以让表单在每个页面上工作?

标签: pythondjango

解决方案


可能您可以context_processor为此创建自定义。然后将此表单模板添加到基础页脚中,以便在每个页面中呈现。以下是创建自定义上下文处理器的方法:

# context processor
# assuming it is in path /project/your_app/context_processors.py

def get_footer_context(request):
    form_class = ContactForm()
    return {
        'contact_form': form_class
    }

然后更新context_processorssettings.py中的:

TEMPLATES = [
    {
        ...
        'OPTIONS': {
            'context_processors': [
                # rest of the context_processors
                'your_app.context_processors.get_footer_context', # <-- Add your context processor
            ],
        },
    },
]

替换your_app为上下文处理器所在的应用程序名称。

最后,将此代码添加到基本模板的页脚(或随处呈现的通用模板)中:

<h1>Contact</h1>
<form role="form" action="{% url 'app_name:contact' %}" method="POST">
    {% csrf_token %}
    {{ contact_form.as_p }}
    <button type="submit">Submit</button>
</form>

在这里,您需要替换为 urlapp_name中的app_name值。


推荐阅读