1

私はdjango Webアプリに取り組んでおり、フォームが送信されたときに2つのことを行う必要があるhtmlフォームがあります:アプリのデータベースにレコードを作成し、収集された値の一部を別のWebサイト(支払いサイトなど)に投稿します)。

私が抱えている問題は、2つのことを同時に行うフォームを取得することです。HTML フォームは 1 つのアクションしか持てないことを知っています。ここで、javascript を使用してフォームに 2 つ以上のアクションを実行させる方法に関するいくつかの投稿を StackOverflow で読みましたが、これまでに試したことはすべて、この状況ではうまくいきませんでした。 . それらはすべて、動作するアクションが 1 つだけのようです。

これは私のdjangoテンプレートが今どのように見えるかです:

{% extends "some other template" %}
{% block content %}
<div>
...
<form id=form1" name="trans_form" method="POST" >
...
<!--DATA TO POST TO PAYMENT SITE-->
<input type="hidden" name="transaction_id" value="some value" />
<input type="hidden" name="transaction_amount" value="some value"/>
<input type="hidden" name="customer_id" value="some value" />
<input type="hidden" name="customer_name" value="some value" />
<!--DATA TO POST TO PAYMENT SITE-->
...
<!--DATA TO POST TO APP DATABASE-->
<input type="hidden" name="user" value="{{ user.id }}">
<input type="hidden" name="type" value="CC">
<input type="hidden" name="ref_no" value="{{ ref_no }}">
Amount: <input type="text" name="amount" id="id_amount" required />
Ref ##: <span>{{ ref_no }}</span>
Date: <span>{{ cur_date|date:'d/m/Y' }}</span>
<a href="#" id="pay-btn" class="button" onclick="submitForm();">Submit</a>
<!--DATA TO POST TO APP DATABASE-->
...
</form>
...
</div>
{% endblock %}

{% block script %}
<script>
function submitForm()
{
    createRecord(document.forms["trans_form"]);
    sendToPay(document.forms["trans_form"]);
}
function sendToPay(f)
{
    f.action= "www.paymentsite.com";
    f.target = null;
    f.onsubmit = null;
    f.submit();
}
function createRecord(f)
{
    f.action = "url to view that creates the record in database";
    f.target = "_blank";
    f.onsubmit = null;
    f.submit();
}
</script>
{% endblock %}

どう思いますか?私は不可能を達成しようとしていますか?そうでない場合は、正しい方向に向けてください。ありがとう。

4

2 に答える 2

6

コントローラーから支払いサイトに単純に POST しない理由:

def handle_payment(request):
    post_to_payment_site(request)
    write_payment_info_to_db(request)

def post_to_payment_site(request):
    data = {'transaction_id': request.form['transaction_id',
        # etc.
    }

    requests.post('payment-provider-url', data=data)

支払いプロバイダー向けの POST データを受け入れることができない場合は、次のいずれかを行うことができます。

  • 支払いプロバイダーに XHR リクエストを送信します。これには、支払いプロバイダーが投稿先のエンドポイントの CORS を適切に実装する必要があります。その要求が完了すると、通常どおりフォームを送信できます。
  • targetフォームの属性を、iframeまたは新しいタブ/ウィンドウを指すように変更します。次に、iframeロード時にtarget属性を削除actionし、エンドポイントに切り替えて送信します。
于 2013-07-26T16:01:16.140 に答える
0

私はついに私の問題を解決しました。それが最も効率的なソリューションかどうかはわかりませんが、ここにあります。

アプリと支払いサイトの間の仲介者として機能する HTML ページをもう 1 つ作成しました。これは非常に単純なページで、実際には最初のフォーム ページのレプリカですが、支払いサイトに投稿する必要のあるフィールドのみが含まれています。このように、多くの JavaScript は必要ありません。フォームを送信すると、アプリ データベースにレコードが作成され、必要なデータが「仲介者」に送信され、仲介者がそのデータを支払いサイトに投稿します。ユーザーは、プロセス全体を通して仲介者を実際に目にすることはありません。

私が言ったように、これは最も効率的な解決策ではないかもしれませんが、うまくいきます。

まず、views.py のコードは次のとおりです。

def write_payment_info_to_db(request):
dt = datetime.now()
form = Form()
err = False
if request.method == 'POST':
    #Collect data to send to GTPay
    transaction_id      = request.POST['transaction_id']
    transaction_amount  = request.POST['transaction_amount']
    customer_id         = request.POST['customer_id']
    customer_name       = request.POST['customer_name']
    #Create record in db for "valid" form data
    form = Form(request.POST)
    if form.is_valid():
        form.save()
        return render_to_response('middleman.html', {'transaction_id': transaction_id,
                                                    'transaction_amount': transaction_amount,
                                                    'customer_id': customer_id,
                                                    'customer_name': customer_name},
                                    context_instance=RequestContext(request))
    else:
        err = form.errors
        return ...
else:
    return ...

そして、これが仲介者です:

<html>
<body onload="document.submit2paymentsite_form.submit()">
    <form name="submit2paymentsite_form" action="payment-provider-url" target="_self" method="POST">
        {% csrf_token %}
        <input type="hidden" name="transaction_id" value="{{ transaction_id }}" />
        <input type="hidden" name="transaction_amount" value="{{ transaction_amount }}" />
        <input type="hidden" name="customer_id" value="{{ customer_id }}" />
        <input type="hidden" name="customer_name" value="{{ customer_name }}" />
    </form>
</body>

于 2013-07-29T13:39:14.287 に答える