После запонения формы в context_processors ошибка ValueError at / dictionary update sequence element #0 has length 0; 2 is required Django
Мне надо сделать заказ звонка, чтобы при нажатии на кнопку отправки номера телефона, происходил редирект.
Сейчас, введеный номер отправляется, однако после нажатия на кнопку отправки, сейчас мне выдается ошибка: dictionary update sequence element #0 has length 0; 2 is required
Непойму как сделать, потому что для контекст процессора должен передаваться словарь..
У меня было в конекст процессоре для редиректа return render(request, 'mail/mail_f.html', {'form': form})
но тогда ни одна страница не открывалась, выдавало ошибку **RecursionError at /
maximum recursion depth exceeded while calling a Python object
Для отображения на всех страницах, форма сделана в context_processors.py:
def call_order(request):
if request.method == 'POST':
form = CallOrderForm(request.POST)
if form.is_valid():
mail = EmailMultiAlternatives(
'Заказ звонка с сайта',
form.cleaned_data['content'],
'@mail.ru',
['@mail.ru'],
)
html_content = f'Презвоните мне: { form.cleaned_data["content"] }'
mail.attach_alternative(html_content, "text/html")
mail.send()
if call_order:
messages.success(request, 'Письмо отправлено')
return redirect('../sendhead/')
else:
messages.error(request, 'Ошибка отправки')
else:
messages.error(request, 'Ошибка валидации')
else:
form = CallOrderForm()
return {'form': form}
часть html из хэдэра для отправки:
<form method="post">
{% csrf_token %}
{{ form.content }}
<button class="btn btn-outline-success" type="submit">Перезвоните</button>
</form>
settings.py
'context_processors': [
'mail.context_processors.call_order',
Python 3.7.9, Django 3.2.14
Если вдруг кому интересно, то исправил вот так:
- Подправил reutrn в def call_order и перенес ее во view
def call_order(request):
if request.method == 'POST':
form = CallOrderForm(request.POST)
if form.is_valid():
mail = EmailMultiAlternatives(
'Заказ звонка с сайта',
form.cleaned_data['content'],
'@mail.ru',
['@mail.ru'],
)
html_content = f'Презвоните мне: { form.cleaned_data["content"] }'
mail.attach_alternative(html_content, "text/html")
mail.send()
if call_order:
messages.success(request, 'Письмо отправлено')
return redirect('../sendhead/')
else:
messages.error(request, 'Ошибка отправки')
else:
messages.error(request, 'Ошибка валидации')
else:
form = CallOrderForm()
return render(request, 'mail/mail_f.html', {'form': form})
- Поправил context_processors.py:
def call_orders(request):
form = CallOrderForm()
return {'form': form}
3.В html шаблоне указал action - страницу обработки формы
<form method="post" action="/mail/sendhead/">
{% csrf_token %}
{{ form.content }}
<button class="btn btn-outline-success" type="submit">Перезвоните</button>
</form>
Готово, теперь заказ звонка находится в хедере на всех страницах.