Как правильно добавить на все страницы сайта форму?

Я пытаюсь разобраться, есть ли способ на все страницы сайта в главный шаблон вставить форму обратной связи. Не дублировать ее шаблон и обработчик в каждом компоненте, а вставить именно один раз в шаблон и подвязать обработчик. Один раз.
Размещать не на отдельной странице, как в примерах в гугле (я не нашел примера для себя), а в основном шаблоне.

Я создал в папке проекта файл forms.py
from django import forms

class ContactForm(forms.Form):
    your_name = forms.CharField(label="Your name", max_length=100, required=False)


И тут проблема, не могу найти описания, как правильно сделать, чтобы в шаблон передать модуль формы. Пытаюсь разобраться на основе одного приложения main в views.py
class MainHome(ListView):
    model = Main
    template_name = 'main/index.tpl'
    context_object_name = 'main'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['title'] = 'Главная'
        context['form'] = ContactForm <- это форма
        return context


В общем шаблоне прописал так:
<form action="" method="post">
        {% csrf_token %}
        
        {% for field in form %}
            <div class="fieldWrapper">
                {{ field.errors }}
                {{ field.label_tag }} {{ field }}
                {% if field.help_text %}
                <p class="help">{{ field.help_text|safe }}</p>
                {% endif %}
            </div>
        {% endfor %}
    
        <input type="submit" value="OK">
    </form>


Форма вывелась, но только в рамках одного этого приложения, то есть в news и прочих формы нет.
При этом, нажатие на отправить приводит к 405 ошибке.
  • Вопрос задан
  • 67 просмотров
Пригласить эксперта
Ответы на вопрос 2
@chemdev
у тебя в контексте форма только в одной вьюхе. Сделай класс FormContextMixin, переопредели get_context_data и наследуй, как вариант.
Ответ написан
@Saipy
Используйте контекстные процессоры
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы