Django перенаправление на вид формы и автозаполнение с ранее введенными значениями

У меня следующий сценарий.

  1. Пользователь заполняет форму
  2. Если пользователь нажимает кнопку "продолжить" и форма действительна, пользователь будет перенаправлен на итоговый просмотр
  3. .
  4. В итоговом представлении пользователь снова проверяет введенные данные. Он может либо продолжить, либо вернуться назад.
  5. Если пользователь продолжит, данные будут сохранены в базе данных, если вернется назад, он сможет отредактировать форму.

Поскольку на шаге 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 %}
Вернуться на верх