Джанго-формы на каждой странице трясогузки, например Контактная форма в нижнем колонтитуле base.html - PullRequest
0 голосов
/ 17 мая 2019

Я хочу внедрить контактную форму, используя django-формы, в нижний колонтитул многостраничного веб-сайта на основе фреймворка wagtail cms. Как я могу отобразить форму в шаблоне base.html на каждой странице? Спасибо!

Ответы [ 3 ]

2 голосов
/ 17 мая 2019

Я бы предложил реализовать его как тег шаблона включения :

@register.inclusion_tag('contact_form.html')
def contact_form():
    return {'form': ContactForm()}

Шаблон contact_form.html будет содержать HTML-код формы.Затем вы можете включить это как часть вашего base.html с тегом: {% contact_form %}

1 голос
/ 19 мая 2019

Несмотря на то, что вы хотите, чтобы контактная форма появлялась на каждой странице, я все равно оставлял бы специальную страницу ContactFormPage И помещал форму в каждом нижнем колонтитуле. Запрос POST должен указывать на этот выделенный ContactFormPage.

<form action='{% pageurl contact_page' %}' ...>

Преимущества:

  • когда контактная форма содержит ошибки, вы находитесь на специальной странице с акцентом на задачу под рукой.
  • Нет необходимости прокручивать назад в нижний колонтитул при возникновении ошибки.
  • Легко добавить страницу успеха через RoutablePageMixin
  • URL контактной формы для совместного использования

Форма HTML может быть включена через:

  • тег шаблона включения (ответ Гасмана)
  • промежуточное ПО (ответ shouravs)
0 голосов
/ 17 мая 2019

создайте middleware.py в корневой папке, где находится settings.py.Затем добавьте это в этот файл

class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.
        request.contact_form = ContactForm()
        response = self.get_response(request)

        # Code to be executed for each request/response after
        # the view is called.

        return response

...