【问题标题】:How to make an ajax request to a view如何向视图发出ajax请求
【发布时间】:2016-09-29 14:01:08
【问题描述】:

我试图弄清楚如何从我的模板发出 ajax 请求(使用 jquery),以便在单击按钮时执行视图。我不想重定向到另一个页面。我只需要执行视图中的代码。

这是我的按钮点击事件:

$(document.body).on("click", "#download_xls",function(e) {
        selected_country = ($("#button-countries").val())
        selected_subareas = $('#_all_values').val();
        id = "?country=" + selected_country + "&" + "regions=" + selected_subareas
        whole_url = "{% url 'test_download' %}" + id
        $("#download_xls").attr("href", whole_url)
    });

当我在 URL 中传递值时,我什至不需要通过 ajax 请求传递一些参数。我只需要执行视图中的代码。

视图是这样的:

def test_download(request):
    print(request.GET.get('country'))
    print(request.GET.get('regions'))

    fileContent = "Your name is %s"
    res = HttpResponse(fileContent)
    res['Content-Disposition'] = 'attachment; filename=yourname.txt'
    return res

已编辑

我在模板中添加了 ajax GET 请求:

       whole_url = "{% url 'test_download' %}"+id
       $.ajax({
            type: "GET",
            url: whole_url,
            success: function(data) {
                alert('sd')
            },
            error: function(data) {
                alert('error')
            },
        });

我收到一个错误,因为该视图没有对应的模板。我想我需要在 urls.py 文件中添加一些内容。

我读到here 需要将urls.py 修改为:

url(r'^link-to-fun1$', views.fun1),

但我不清楚应该是什么链接到 fun1。 我试过了:

 url(r'^create$', 'test_download', name='test_downlad'),

但给出错误:没有反向匹配。

【问题讨论】:

  • 那么什么不起作用?
  • 那你在寻求什么帮助?很明显,您知道如何使用 jQuery;你为什么不在那个事件处理程序中写一个$.get() 调用?
  • 再说一次,我不明白你在问什么。您的视图中没有提到模板,因此它不会返回有关缺少模板的错误。 URL 可以是任何你想要的;由于您是使用 url 标记动态生成的,因此实际路径是什么没有区别。但所有这些都是绝对的 Django 基础,与 Ajax 没有任何关系;从 Django 的角度来看,Ajax 请求与任何其他请求完全相同。
  • @user1919 是的,您必须将视图添加到 urls.py 文件中,否则 django 将无法将请求分派到正确的视图(请求响应循环)。正如 Daniel Roseman 所指出的,路径是什么并不重要,因为您正在命名您的 url 并使用 url 模板标签调用该 url。只要确保它是独一无二的。我还想指出您的 urls.py 文件中有错字。 'test_download' 拼写错误(对于视图名称和 url 名称),这是没有反向匹配错误的原因。除非您只是在 SO 上有错字

标签: ajax django


【解决方案1】:

您可以使用TemplateView 添加到您的网址并使用 JQuery 来执行某些操作,如下所示:

views.py

class ajax_view(TemplateView):
    def get(self, request, *args, **kwargs):
            id_value = request.GET['id']
            value = Model.objects.filter(id=id)
            data = serializers.serialize('json', value, fields=('fieldone'))
            return HttpResponse(data, content_type='application/json')

urls.py

url(r'^ajax/$', ajax_view.as_view()),

jQuery

$.ajax({
            data: { 'id': id },
            url: '/ajax/',
            type: 'get',
            success: function (data) {
                // Do something with the data
            }
        })

这就是你如何在 Django 中使用 Ajax,重要的是使用 TemplateView

【讨论】:

    猜你喜欢
    • 2013-02-11
    • 2015-06-27
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多