【问题标题】:Django - adding contact form to footerDjango - 将联系表格添加到页脚
【发布时间】:2019-05-16 06:35:27
【问题描述】:

我正在尝试创建一个可以在我的应用的所有页面上使用的联系表单。

context_processors.py 中的函数 contact_form(request) 成功显示了我的基本模板扩展到的所有模板中的联系表单,但问题是我无法提交信息并使用它运行 POST 请求。

经过广泛研究,似乎唯一干净的方法是让context_processors.py 执行 GET 请求并让自定义模板标记处理 POST 请求。

采用这种方法,我找不到在模板标签中处理它的方法。我尝试了几种不同的方法,并得到了几个不同的错误。为了达到这一点,我还查看了许多帖子,包括 Contactform in footer of page,但似乎没有任何答案显示模板中的格式。

settings.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

tags.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>

【问题讨论】:

    标签: python django django-forms django-templates


    【解决方案1】:

    我知道我的问题是什么。由于我的大部分视图都使用基于类的视图,因此我需要添加一个单独的 post() 方法来处理 POST 请求,如下所示。基于函数的视图不需要这样做。弄清楚这一点后,我放弃了模板标签并将所有逻辑添加到context_processor.py

    views.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
    

    【讨论】:

      猜你喜欢
      • 2014-07-28
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      相关资源
      最近更新 更多