django 重定向到表单视图并自动填充以前输入的值

django redirect to form view and autofill with previously entered values

我有以下场景。

  1. 用户填写表格
  2. 如果用户单击“继续”按钮并且表单有效,用户将被重定向到摘要视图
  3. 在摘要视图中,用户再次检查输入。他可以继续或返回。
  4. 如果他继续,数据将保存在数据库中,如果他返回,他可以编辑表格。

由于在第 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 view/template 我可以在主页和摘要之间循环,直到用户对他输入的表单数据感到满意为止

当有获取主页视图的请求时,检查request.session怎么样?然后你可以绑定 message_form = MessageForm() 到会话数据。

您可以查看htmx and 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 %}