2

私のurlpatternsの1つがこのように見えるとしましょう。

url('^objects/update/(?P<pk>\d+)$', views.UpdateView.as_view(), name = 'update-object'),

選択したオブジェクトに応じて、ユーザーを更新ページにリダイレクトする必要があります (オブジェクトのリストは Ajax を使用して入力されます)。したがって、クライアント側で実際の URL を構築するために、その名前付き URLパターンを JavaScriptに渡したいと思います。

私が達成したいことの例:

  1. 名前'update-objects'を関数に渡す
  2. 実際の URL パターンを取得し、次のように置き換え(?P<pk>..)ます{pk}
  3. 結果を JavaScript に渡すと、次のようになります。objects/update/{pk}

任意のヒント?ありがとう


より明確にするために、レンダリングの時点では、PK がまだ不明であるため、URL の逆引きを実行できません。後で実際の URL に変換される一種の javascript-urlpattern を作成する必要があります (つまり、私の JS コードは {pk} 部分を実際の pk 値に置き換えます)。

4

4 に答える 4

4

実際の URL リバースはサーバー側で行う必要があります。これを行うにはいくつかの方法がありますが、最も洗練された方法はおそらく、スクリプトとマークアップがこのためにどの程度正確に設定されているかによって異なります。私が最近行ったことの 1 つは、jQuery を使用して簡単に取得できる HTML5 データ属性を使用して、URL を論理要素にアタッチすることです。jQuery を使用していない場合は、純粋な JS への変換を任せます。クライアント側のコードや詳細を提供していないため、ここでは暗闇で撮影していますが、これでアイデアが得られるかもしれません。

Django HTML テンプレート:

<ul class="object-list">
 {% for object in objectList %}
  <li data-update-url="{% url update-objects object.pk %}">object.name</li>
 {% endfor %}
</ul>

JS:

$('.object-list').on('click', 'li' function () {
  var updateUrl = $(this).data('update-url')
  ...
});
于 2013-01-30T15:27:32.400 に答える
2

オブジェクトが実際に選択されたら、追加の ajax 呼び出しを行う必要があるようです。クライアント側で URL を計算しようとして、url.conf を推測しようとしないでください。後で問題が発生するだけです。pk を取得できるまで待ってから、django の reverse 関数を使用して URL を取得します (それ以外のことを行うと、DRYに違反します)。

URLを返す簡単なビューを作成するのはどうですか -

from django.core.urlresolvers import reverse
from django.http import HttpResponse, HttpResponseBadRequest

def get_url(request):
    if request.is_ajax() and request.method == 'POST':
        obj_id = request.POST['obj_id']
        url = reverse('object-update', kwargs{'pk': obj_id})
        return HttpResponse(obj_id)
    return HttpResponseBadRequest()

次に、新しいビューへの ajax 呼び出しを使用して URL を取得し、リダイレクトする JavaScript 関数を記述します。オブジェクトが選択されるとすぐに、この関数を呼び出します。これを行うには JQuery を使用することをお勧めします。純粋な JavaScript では、より多くのコードを記述する必要があり、おそらくブラウザー固有のコードを記述する必要があります (ターゲットによって異なります)。また、django の csrf 保護の処理もサポートしています (まだ実装していない場合は、ajax 呼び出しに対してこれを実装する必要があります)。

var redirect = function(obj) {
    $.ajax({
        url: '/your-get-url-view/',
        method: 'post',
        data: {'obj_id': obj},
        success: function(url){
            window.location = url;
        }
    });
}

残念ながら、選択したオブジェクトから pk にどのように到達しているのかわかりません (簡単にするために、redirect関数で使用できると想定しています)。そこに到達するには、ビューで何らかの処理を行う必要がある場合があります。

私は上記のコードをテストしていませんが、私が提案していることは理解できるはずです。

于 2013-01-30T18:26:43.283 に答える
1

これを試してください:

Django URL を生成する逆の方法
https://github.com/mlouro/django-js-utils

もう1つ
https://github.com/Dimitri-Gnidash/django-js-utils

于 2013-01-30T17:54:18.563 に答える