Django перенаправление на вид формы и автозаполнение с ранее введенными значениями
У меня следующий сценарий.
- Пользователь заполняет форму
- Если пользователь нажимает кнопку "продолжить" и форма действительна, пользователь будет перенаправлен на итоговый просмотр .
- В итоговом представлении пользователь снова проверяет введенные данные. Он может либо продолжить, либо вернуться назад.
- Если пользователь продолжит, данные будут сохранены в базе данных, если вернется назад, он сможет отредактировать форму.
Поскольку на шаге 4 пользователь находится в представлении summary, я должен перенаправить его в представление home. Я не хочу, чтобы пользователь снова заполнял всю форму, ранее введенные данные должны быть автоматически заполнены, если он вернется обратно.
Нечто особенное: я использую django-tagify2 для одного ввода в форме, чтобы получить теги, а не текст. Если пользователь возвращается назад, то теги должны быть правильно отображены в форме, специфичной для tagify.
Вот мои файлы:
home.html
{% extends "messenger/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="message-container">
<form method="POST" autocomplete="off">
{% csrf_token %}
{{ form|crispy }}
<button name="sendmessage" class="btn btn-outline-info" type="submit">Continue</button>
</form>
</div>
{% endblock content %}
summary.html
{% extends "messenger/base.html" %}
{% block content %}
<h4>Zusammenfassung</h4>
<p><b>Empfänger: </b>{{ receiver }}</p>
<br>
<p><b>Betreff: </b>{{ subject }}</p>
<br>
<p><b>Nachricht: </b>{{ message }}</p>
<button><a href="/">Edit</a></button>
<button><a href="/send_message">Continue</a></button>
{% endblock content %}
просмотр дома
@login_required(login_url='login')
def home(request):
if request.method == 'POST' and 'sendmessage' in request.POST:
message_form = MessageForm(request.POST)
if message_form.is_valid():
receiver_list = message_form['receiver'].value().split(';')
subject = message_form['subject'].value()
message = message_form['textmessage'].value()
#create sessions and send data to next view
session_receiver = receiver_list
request.session['session_receiver'] = session_receiver
session_subject = subject
request.session['session_subject'] = session_subject
session_message = message
request.session['session_message'] = session_message
return redirect('summary')
else:
message_form = MessageForm()
return render(request, 'messenger/home.html', {'form': message_form})
сводное представление
def summary(request):
receiver = request.session.get('session_receiver')
subject = request.session.get('session_subject')
message = request.session.get('session_message')
return render(request, 'messenger/summary.html', {'receiver':receiver,
'subject':subject,
'message':message})
Как лучше всего это сделать? Могу ли я использовать переменные сессии для установки полей в форме?
Я не хочу менять логику в приложении. Мне нужен вид/шаблон home/summary/success, в котором я могу циклически переходить между home и summary до тех пор, пока пользователь не будет доволен введенными данными формы
Как насчет проверки request.session при получении запроса к представлению home? Тогда вы сможете привязать message_form = MessageForm() к данным сессии.
Вы можете проверить htmx и django-htmx. Вы можете легко сделать то, что хотите, без сессии, поменяв HTML с контекстом.
Я поиграл со значениями сессии и представлениями и наконец получил способ перенаправления на другие представления с предварительно заполненными полями формы, основанными на значениях сессии.
@login_required(login_url='login')
def home(request):
if request.method == 'POST' and 'sendmessage' in request.POST:
message_form = MessageForm(request.POST)
if message_form.is_valid():
ad_group = message_form['ad_group'].value().split(';')
ad_user = message_form['ad_user'].value().split(';')
subject = message_form['subject'].value()
message = message_form['textmessage'].value()
#create sessions and send data to next view
session_ad_group = ad_group
request.session['session_ad_group'] = session_ad_group
session_ad_user = ad_user
request.session['session_ad_user'] = session_ad_user
session_subject = subject
request.session['session_subject'] = session_subject
session_message = message
request.session['session_message'] = session_message
return redirect('summary')
else:
if request.session.get('session_subject'):
message_form = MessageForm(initial={'ad_group': request.session.get('session_ad_group'),
'ad_user': request.session.get('session_ad_user'),
'subject': request.session.get('session_subject'),
'textmessage': request.session.get('session_message')})
return render(request, 'messenger/home.html', {'form': message_form})
else:
message_form = MessageForm()
return render(request, 'messenger/home.html', {'form': message_form})
def summary(request):
ad_group = request.session.get('session_ad_group')
ad_user = request.session.get('session_ad_user')
subject = request.session.get('session_subject')
message = request.session.get('session_message')
if request.method == 'POST' and 'edit' in request.POST:
message_form = MessageForm(initial={'ad_group':ad_group, 'ad_user': ad_user,
'subject':subject, 'textmessage':message})
return render(request, 'messenger/home.html', {'form': message_form})
return render(request, 'messenger/summary.html', {'ad_group':ad_group,
'ad_user': ad_user,
'subject':subject,
'message':message})
Шаблон
{% extends "messenger/base.html" %}
{% block content %}
<h2>Zusammenfassung</h2>
<div class="border-top pt-3">
<p><b>AD-Gruppe: </b>{{ ad_group }}</p>
<p><b>AD-User: </b>{{ ad_user }}</p>
<br>
<p><b>Betreff: </b>{{ subject }}</p>
<br>
<p><b>Nachricht: </b>{{ message }}</p>
<div class="buttoncontainer">
<form name="edit" action="" method="post">
{% csrf_token %}
<button class="btn edit_btn" formaction="{% url 'messenger-home' %}">Zurück</button>
</form>
<form name="senden" action="" method="post">
{% csrf_token %}
<button class="btn continue_btn" formaction="{% url 'send_messages' %}">Nachricht senden</button>
</form>
</div>
</div>
{% endblock content %}