Джанго - добавление контактной формы в нижний колонтитул - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь создать форму контакта, которую можно использовать на всех страницах моего приложения.

Моя функция contact_form(request) в context_processors.py успешно показывает форму контакта во всех шаблонах, которые расширяет мой базовый шаблон.к, но проблема в том, что я не могу отправить информацию и выполнить с ней запросы POST.

После обширных исследований кажется, что единственный чистый способ сделать это - это выполнить context_processors.pyGET-запрос и пользовательский тег шаблона обрабатывает POST-запрос.

При таком подходе я не могу найти способ обработать это в теге шаблона.Я пробовал несколько разных способов и получил несколько разных ошибок.Я также посмотрел на многие посты там, чтобы добраться до этой точки, в том числе Contactform в нижнем колонтитуле страницы , и, похоже, нет никаких ответов, которые показывают, как это отформатировано в шаблоне.

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>

1 Ответ

0 голосов
/ 16 декабря 2018

Я понял, в чём была моя проблема.Поскольку я использую представления на основе классов для большинства своих представлений, мне нужно было добавить отдельный метод 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
...