1

こんにちは、AJAX を使用してデータベースからサブジェクト名を表示しようとしています。それが今の私の出力です:

[{"pk": 1, "model": "school.subjects", "fields": {"name": "Math 140"}},
{"pk": 2, "model": "school.subjects", "fields": {"name": "English 102"}},
{"pk": 3, "model": "school.subjects", "fields": {"name": "CS210"}}]

しかし、表示したいのは : どうすればそれを行うことができますか?

Math 140
English 102
CS210

それは私の見解です:

@csrf_exempt
def subjects_list(request):
    if request.is_ajax():
        user = request.user
        subjects = Subjects.objects.filter(user__exact = user)
        result = serializers.serialize("json", subjects, fields=('name'))
    else:
        result = "blablabl"
    return HttpResponse(result)

そして、それは私のtest.htmlです

{% extends "base.html" %}
{% block main-menu %}
    <div id="result"></div>
    <script type="text/javascript">
        $(function() {
            $.get("/subjects-list", function(data){
                $("#result").append(data);
            });
        }); 
    </script>
{% endblock %}
4

2 に答える 2

1

モデルを直接シリアル化しないでください。ユーザーが適切な内部フィールドを表示するため、安全ではありません。

django-tastypiedjango-pistonなどの実際の API エンジンを使用したい場合。この種のエンジンを使用すると、表示するフィールドの選択、承認の管理、出力形式などを行うことができます...

たとえば、次の場合tastypie:

class SubjectResource(ModelResource):
    class Meta:
        queryset = Subject.objects.all()
        resource_name = 'subjects'
        fields = ['name']

生産します:

{
  "objects": [
    {"name": "Math 140"},
    {"name": "English 102"},
    {"name": "CS210"},
  ]
}

もちろん、objects次のインスタンス メソッドを使用してラッパーを削除できます。

def alter_list_data_to_serialize(self, request, data):
    data[self.Meta.resource_name] = data['objects']
    del data['objects']
    del data['meta']
    return data

それが最もクリーンな方法です。

于 2012-08-12T20:31:20.270 に答える
1

これは、サーバーから返されるデータが JSON であるためです。これは、DOM にロードする前に解析する必要があります。次のようなことができます。

コピーして、 test.htmlに追加します...

{% extends "base.html" %}
{% block main-menu %}
    <div id="result"></div>
    <script type="text/javascript">
        $(function() {
            $.get("/subjects-list", function(data){
                var $results = $("#result");
                for (var i = 0; i < data.length; i++) {
                    $results.append(data[i]["fields"]["name"] + "<br/>");
                }
            }, "json");
        }); 
    </script>
{% endblock %}

とはいえ、javascript テンプレート ライブラリの使用を検討することをお勧めします。それらはたくさんあります。一般的な考え方は、ライブラリが AJAX 応答の HTML への変換を処理できるということです。

ここで使用する質問に答えるスタックオーバーフローの質問がいくつかあります。

JQuery に推奨される JavaScript HTML テンプレート ライブラリは?

jQuery の推奨テンプレート ライブラリは何ですか?

詳細については、「javascript テンプレート」で検索してください。

于 2012-08-12T20:34:52.000 に答える