6

ユーザーの選択に応じてデータベース オブジェクトを取得したい。解決策の 1 つとして Ajax が考えられることはわかっていますが、それを実現する方法がわかりません。コードは次のとおりです。

ビュー.py:

def automation(request):
    //some code
    car = CAR.objects.get(ida_name='honda')
    model = car.model_set.all()
    //some code

template.html:

Select CAR: <select id="car" name="car">
{% for car in car_list %}
<option value="{{ car.id }}" id="{{ car.id }}">{{ car.car_name }}</option>
{% endfor %}
</select>

Select car model: <select id="model" name="model">
{% for model in car.model_set.all %}
<option value="{{ forloop.counter }}">{{ model.model_name }}</option>
{% endfor %}
</select>

ここでは、たとえば「honda」という名前をテンプレートから (ユーザーがドロップダウンで選択するとすぐに) 私の view.py に渡したいと考えています。これにより、対応するオブジェクトがフェッチされ、結果が「モデル」のテンプレートに返されます。 ' ドロップダウンリスト。(したがって、基本的に、ユーザーが車のドロップダウン リストから車を選択すると、車のモデル リストが更新されます)

注:モデルは、models.py で Car と多対多の関係にあります。

私はかなり長い間ここで立ち往生しており、どんな助けも本当に感謝しています.

4

2 に答える 2

6

AJAX を使用して Django コードにコールバックし、車の名前を返すことができます。

template.html

$(document).ready(function () {
    $(document).on("click",'.car_add', function() {
        $car_id = $(this).attr('id')
        $.ajax({
            type: "POST",
            // This is the dictionary you are SENDING to your Django code. 
            // We are sending the 'action':add_car and the 'id: $car_id  
            // which is a variable that contains what car the user selected
            data: { action: "add_car", id: $car_id },
            success: function(data){
                // This will execute when where Django code returns a dictionary 
                // called 'data' back to us.
                $("#car").html("<strong>"+data.car+"</strong>");                
            }
        });
    });
});

ビュー.py

def post(self,request, *args, **kwargs):
    if self.request.is_ajax():
        return self.ajax(request)

def ajax(self, request):
    response_dict= {
        'success': True,
    }
    action = request.POST.get('action','')

    if action == 'add_car':
        car_id = request.POST.get('id','')

    if hasattr(self, action):
        response_dict = getattr(self, action)(request)
        car = CAR.objects.get(ida_name='car_id')
        response_dict = {
            'car_name':car.name
        }

    return HttpResponse(simplejson.dumps(response_dict),
                        mimetype='application/json')

要約すると、ここであなたがしていることは次のとおりです。

  • 車の 'id' を Ajax 経由で Django に送り返します。
  • Django はそれ自体に「投稿」し、それが AJAX 呼び出しであることを認識し、AJAX 関数を呼び出します
  • Django は、アクションが「add_car」であり、if ステートメントを実行することを確認します
  • Django は、送信した ID を使用して DB にクエリを実行し、車を返します
  • Django はそのデータを JSON オブジェクト (この場合は辞書) としてページに送り返します。
  • JQuery は、渡された情報を使用してページを更新します。

明確な例を見たい場合は、このリンクを参照してください

于 2013-06-19T14:00:38.677 に答える
1

AJAX リクエストを使用していると仮定します。

クエリ結果またはモデル インスタンスを JSON として直接返すことはできません。しかし、あなたはそれをシリアル化することができます。1 つの可能性を次に示します。

from django.forms.models import model_to_dict
model_to_dict(intance, fields=[], exclude=[])

model_to_dict3 つのパラメータを取ります:

  1. 特定のモデル インスタンス
  2. 含めるフィールド
  3. 除外するフィールド

パラメータ 2 と 3 はオプションです。フィールドを指定しない場合、メソッドはそれらすべてをシリアル化します。複数のインスタンス (クエリ結果など) に対してこれを行うには、各インスタンスのループでそれを行うだけです。

于 2013-06-19T13:50:34.493 に答える