【问题标题】:Django view return value with AJAXDjango 使用 AJAX 查看返回值
【发布时间】:2018-10-02 06:46:30
【问题描述】:

我正在使用 Django 和 AJAX,

我有一个模板,人们可以在其中选择一个选项,然后单击提交按钮。该按钮触发了一个 Ajax 函数,该函数将数据发送到我的视图进行处理,并且应该将一个值返回给模板。

问题是当帖子通过时,它点击视图,并且没有任何内容返回到模板,我不确定这是否是因为视图没有获取任何数据,但它没有触发任何我的条件语句,所以它的行为就像它的工作,但不返回任何东西。

我的 HTML 表单:

<form method="POST" id="buy_form" name="buy_form" action="{% url 'manage:buy' %}">
    {% csrf_token %}
    <div class="buy_top_section">
        <div class="width">
            <div class="spacing">
                <h3 class="sell_title">How much do you want to sell?</h3>
                <input type="text" id="amount" class="buy_input_top" maxlength="10" name="amount" type="number" required>
                <select id="selected" class="buy_selection" name="wanted">
                    <option value="generate_b">BTC</option>
                    <option value="generate_e">ETH</option>
                    <option value="generate_l">LTC</option>
                </select>
            </div>
            <span class="float_clear"></span>
            <button id='generate' type="submit" value="currency_details" class="custom_button"l">Generate
            </button>
        </div>
    </div>
</form>

<!-- What needs to be returned from thew view -->
<h1>{{ address }}</h1>

我的 AJAX $(document).on('submit', '#buy_form', function (e) { e.preventDefault()

    $.ajax({
        type: 'POST',
        url:'/manage/buy/',
        data:{
            currency:$('selected').val(),
            amount:$('#amount').val(),
            csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val()
            },
            success: function (){

            }
        })
    });

我的 Django 视图

def buy_corsair(request):

    if request.method == 'POST':

    if request.POST.get('wanted') == 'generate_b':
        # Get the amount entered
        amount = request.POST.get('amount')
        # Generate a new B address
        new_b_address = client.create_address(b_account_id)['address']
        # Point the address at the user
        request.user.user_address.b_address = new_b_address
        # Save address to current user
        request.user.user_address.save()
        # Pass the address to the template
        context = {'address': new_b_address}
        return render(request, context)

urls.py

urlpatterns = [
    # Buy Page
    path('buy/', views.buy_corsair, name='buy'),
]

【问题讨论】:

    标签: python ajax django


    【解决方案1】:

    在你的 Django 视图中

    import json
    from django.http import HttpResponse
    def buy_corsair(request):
       if request.method == 'POST':
          if request.POST.get('wanted') == 'generate_b':
             # Get the amount entered
             amount = request.POST.get('amount')
             # Generate a new B address
             new_b_address = client.create_address(b_account_id)['address']
             # Point the address at the user
             request.user.user_address.b_address = new_b_address
             # Save address to current user
             request.user.user_address.save()
             # Pass the address to the template
             context = {'address': new_b_address}
             return HttpResponse(json.dumps(context))
    

    在你的 js 中

     $.ajax({
        type: 'POST',
        url:'/manage/buy/',
        data:{
            currency:$('selected').val(),
            amount:$('#amount').val(),
            csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val()
            },
            success: function (response){
                console.log(response);
                //access the value and print it in console//
                var obj=JSON.parse(response)["address"];
    
                alert(obj);
          
            }
        })
    });
    

    【讨论】:

    • 尝试添加更多信息来解释 OP 如何解决问题。代码是一种很好的方式,但也要确保解释你的答案!
    【解决方案2】:

    Ajax 请求在后台运行,django 渲染函数将模板渲染到 body,所以不能这样渲染。你可以喜欢这个;

    别忘了包含

    from django.http import HttpResponse
    
    def buy_corsair(request):
        if request.method == 'POST':    
            if request.POST.get('wanted') == 'generate_b':
                # Get the amount entered
                amount = request.POST.get('amount')
                # Generate a new B address
                new_b_address = client.create_address(b_account_id)['address']
                # Point the address at the user
                request.user.user_address.b_address = new_b_address
                # Save address to current user
                request.user.user_address.save()
                # Pass the address to the template
                return HttpResponse(new_b_address)
    

    在你的 js 中;

    $.ajax({
        type: 'POST',
        url:'/manage/buy/',
        data:{
            currency:$('selected').val(),
            amount:$('#amount').val(),
            'csrfmiddlewaretoken': "{{ csrf_token }}"
            },
            success: function (data){
                $('h1').html(data);
            }
        })
    });
    

    【讨论】:

    • 我没有考虑它的处理方式,谢谢你教我一些新东西!
    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 2017-04-29
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多