来自Django的上下文渲染不显示直到刷新?

时间:2017-10-04 03:52:10

标签: ajax django django-templates django-views

我正在使用AJAX调用将值发布到我的视图中。 根据我的观点,我发现了基于传递给我视图的值(id)的产品。我将它添加到我的发票中并将其应用到我在我的视图底部呈现的上下文中。直到我刷新才会显示上下文,但我不能这样做。我被卡住了。

ajp-bio-8010-exec-4225" prio=5 tid=0x123964 nid=0x1e43c RUNNABLE (JNI Native Code) - stats: cpu=13562 blk=-1 wait=-1
 java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
    at java.net.SocketInputStream.read(SocketInputStream.java:170)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at oracle.net.ns.Packet.receive(Packet.java:283)
    at oracle.net.ns.DataPacket.receive(DataPacket.java:103)
    at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:230)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:175)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:100)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:85)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:123)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:79)
    at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1122)
    at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1099)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:288)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:523)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
    at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1010)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1315)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3576)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3657)
     - locked oracle.jdbc.driver.T4CConnection@448fbe18

1 个答案:

答案 0 :(得分:-1)

您不能直接通过服务器重新呈现客户端的HTML DOM。

通过DjangoTemplate Engine,它只渲染然后用HTML本身进行响应。这意味着除非更新根元素<html>,否则无法使用ajax更新客户端的DOM。 (这与重新加载页面一样!)

因此,您可能希望使用某些数据更新DOM树,使用ajax调用,然后仅使用json文件进行更新。如果您使用JsonResponse,那么您可以使用AJAX响应对象来获取它。

然后你要做的不是django模板,而是JavaScript编程。

在views.py中,请执行以下操作:

# in your views.py
...
elif request.is_ajax():
    product_id = request.POST.get('value')
    if product_id:
    product_info = Product.objects.get(id=product_id)
    new_invoice_product = InvoiceProduct.objects.create(invoice_product_set=product_info)
    invoice.attached_products.add(new_invoice_product)
    context['attached_products'] = invoice.attached_products.all()
    # return render(request, 'inventory/invoice_create.html', context) # NOT render but do like this:
    return JsonResponse({
        'new_data': {
            'id': new_invoice_product.id
            # and other informations you want...
        }
    })

在您的HTML中,请执行以下操作:

<script src="https://code.jquery.com/jquery-3.2.1.min.js"
        integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
        crossorigin="anonymous"></script>
<script>
    // in your HTML
    // guessing you're using jquery..
    $.ajax({
        url: "test.html",
        context: document.body
    }).done(function (json) {
        $('yourSelector').append(json['new_data']['id']);
    });
</script>

请记住,此代码只是片段而不是完全正常运行的代码。如果您想了解更多示例,请查看链接:

https://simpleisbetterthancomplex.com/tutorial/2016/08/29/how-to-work-with-ajax-request-with-django.html