0

jquery-autocomplete プラグインと django スクリプトに問題があります。使いやすいオートコンプリート プラグインが必要です。そして、これ ( http://code.google.com/p/jquery-autocomplete/ ) を見ると、非常に便利で簡単に思えます。django の部分については、これ ( http://code.google.com/p/django-ajax-selects/ ) を使用します。出力が少し奇妙に見えたので、少し修正しました。新しい行ごとに 2 つの '\n' があり、応答に Content-Length ヘッダーがありませんでした。私が見つけたオンラインの例はすべてそれらを持っていたので、最初はこれが問題かもしれないと思いました。しかし、それは問題ではありませんでした。

次の本文を持つ非常に小さな test.html があります。

<body>
<form action="" method="post"> 
<p><label for="id_tag_list">Tag list:</label> 
<input id="id_tag_list" name="tag_list" maxlength="200" type="text" /> </p> 
<input type="submit" value="Submit" /> 
</form> 
</body>

これは、入力にオートコンプリートを追加するための JQuery 呼び出しです。

function formatItem_tag_list(row) {
    return row[2]
}
function formatResult_tag_list(row) {
    return row[1]
}

$(document).ready(function(){
    $("input[id='id_tag_list']").autocomplete({
        url:'http://gladis.org/ajax/tag',
        formatItem: formatItem_tag_list,
        formatResult: formatResult_tag_list,
            dataType:'text'
    }); 
});

Textfield Firefox (firebug) 内に何かを入力すると、Chromium-browser は ajax 呼び出しであるが応答がないことを示します。この行をブラウザにコピーするだけで、応答を確認できます。(この問題は解決しました。別のドメインからデータを取得しないという ajax の安全機能でした)

たとえば、テキスト フィールドに Bi と入力すると、「http://gladis.org/ajax/tag?q=Bi&max ... という URL が生成されます。これをブラウザに入力すると、次の応答が返されます。

4|Bier|Bier
43|Kolumbien|Kolumbien
33|Namibia|Namibia

今私の ajax 呼び出しは正しい応答を取得しますが、可能なすべてのエントリを含むリストはまだ表示されません。出力をフォーマットしようとしましたが、これもうまくいきません。関数にブレークポイントを設定したところ、それらがまったく呼び出されないことに気付きました。

ここに私の最小限の HTML ファイルへのリンクがありますhttp://gladis.org/media/input.html

私が何を間違えたのか誰にもわかりません。また、すべてのファイルを小さな zip としてhttp://gladis.org/media/example.zipにアップロードしました。

ご協力ありがとうございました!

[編集] URL conf は次のとおりです。

(r'^ajax/(?P<channel>[a-z]+)$', 'ajax_select.views.ajax_lookup'),

および ajax ルックアップ チャネル構成

AJAX_LOOKUP_CHANNELS = {
    # the simplest case, pass a DICT with the model and field to search against :
    'tag' : dict(model='htags.Tag', search_field='text'),
}

とビュー:

def ajax_lookup(request,channel):
    """ this view supplies results for both foreign keys and many to many fields """

    # it should come in as GET unless global $.ajaxSetup({type:"POST"}) has been set
    # in which case we'll support POST
    if request.method == "GET":
        # we could also insist on an ajax request
        if 'q' not in request.GET:
            return HttpResponse('')
        query = request.GET['q']
    else:
        if 'q' not in request.POST:
            return HttpResponse('') # suspicious
        query = request.POST['q']

    lookup_channel = get_lookup(channel)

    if query:
        instances = lookup_channel.get_query(query,request)
    else:
        instances = []

    results = []
    for item in instances:
        results.append(u"%s|%s|%s" % (item.pk,lookup_channel.format_item(item),lookup_channel.format_result(item)))

    ret_string = "\n".join(results)
    resp = HttpResponse(ret_string,mimetype="text/html")
    resp['Content-Length'] = len(ret_string)
    return resp
4

4 に答える 4

1

おそらく、URL の末尾にスラッシュが必要です。

また、jQuery セレクターが間違っています。角括弧内に引用符は必要ありません。ただし、とにかく、そのセレクターは次のように記述する方が適切です。

$("input#id_tag_list")

あるいは単に

$("#id_tag_list")
于 2010-02-25T18:49:13.590 に答える
1

別の可能性を考えたので別の回答: 静的ページは Ajax 呼び出し (gladis.org) と同じドメインから提供されていますか? そうでない場合、same-domain ポリシーにより、Ajax が読み込まれなくなります。

于 2010-02-25T19:37:58.113 に答える
0

余談ですが、document.ready が Django テンプレートにあると仮定すると、URL をハードコーディングするのではなく、{% url %} タグを使用することをお勧めします。

$(document).ready(function(){
    $("input[id='id_tag_list']").autocomplete({
        url:'{% url my_tag_lookup %}',
        dataType:'text'
    }); 
});

このようにして、JS スニペットは計算された URL でレンダリングされ、コードは移植可能のままになります。

于 2010-02-25T19:05:40.690 に答える
0

解決策を見つけましたが、最初のアプローチがうまくいかなかった理由はまだわかりません。別のライブラリに切り替えただけです。http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/を選択します。これは実際にjQueryによって促進され、機能します;)

于 2010-04-10T16:00:32.517 に答える