如何将带有上下文变量的 Django 模板发送到 Ajax 调用?

Posted

技术标签:

【中文标题】如何将带有上下文变量的 Django 模板发送到 Ajax 调用?【英文标题】:How can I send a Django Template with Context Variables to an Ajax Call? 【发布时间】:2020-02-06 11:35:10 【问题描述】:

如何将 Django 模板发送到 ajax 请求并包含该模板的上下文变量?

【问题讨论】:

你能解释一下你想要达到什么目标吗? 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。避免一次问多个不同的问题。请参阅How to Ask 页面以获得澄清此问题的帮助。 【参考方案1】:

您可以简单地使用render

def some_ajax_view(request):
    do_stuff()
    ...
    context = 'some_template_variable':'foo'
    return render(request, 'some_template.html, context)

现在您可以在 ajax 请求中访问模板:

$.ajax(   
    ...
    success: function(response, status, XHR) 
        console.log(response); // this will print the entire html template
        $('#some-element').append(response); // this will insert the template into "some-element"
    );

如果你需要在你的ajax成功回调中访问上下文变量,你可以使用render_to_string:

from django.template.loader import render_to_string
from django.http import JsonResponse

def some_ajax_view(request):
    do_stuff()
    ...
    context = 'some_template_variable':'foo'
    html = render_to_string('some_template.html', context)
    print(html) # this will print the entire html template
    return JsonResponse('html':html, 'context')

编辑

如果您正在发出POST 请求,则需要在页面初始加载时添加一个 csrf 令牌(不是来自 ajax 视图):

def initial_view(request):
    do_stuff()
    return render(request, 'initial_template.html', context)

现在initial_template.html:

<script type="text/javascript">
window.csrf_token = " csrf_token ";
</script>

然后,在您的 ajax 调用中,您需要将其包含在请求正文中:

$.ajax(   
  method: 'POST',
  data: 
    csrfmiddlewaretoken: window.csrf_token,
    some_other_data: 'foo',
    ...
  ,
  success: function(response, status, XHR) 
  ...

  );

【讨论】:

如何包含 csrf 令牌?我收到此错误:禁止(CSRF 令牌丢失或不正确

以上是关于如何将带有上下文变量的 Django 模板发送到 Ajax 调用?的主要内容,如果未能解决你的问题,请参考以下文章

Django 如何将自定义变量传递给上下文以在自定义管理模板中使用?

我将如何在 Django 模板标签中使用模板上下文变量的值? [复制]

Django,如何将变量从 Django 管理员传递到模板?

如何将上下文变量与 Django 模板中的 SQL ID 进行比较?

如何列出所有可用的上下文变量?

如何将变量发送到由通用视图调用的模板