使用Django通过AJAX URL传递参数

6
以下是我的代码。在控制台中,'n'正确地记录了日志,如果我手动将'n'的值输入到url: '{% url "delete_photo" iddy=2%}'中,一切都能正常工作。但是,当我尝试使用 'n' 作为变量(如下所示)时,它会给我一个反向匹配未找到错误。有人可以帮忙吗?
 function test(n){
    console.log(n);
    $.ajax({
      type: 'get',
      url: '{% url "delete_photo" iddy=n%}',

      datatype:'json',
      success: function(data){
                alert(n)
                console.log(data)
                console.log(n)
                },
      error: console.log("SSS"),

    });}

html

{% for t in photos %}
<div id="photobox" ><img id="img_pb3"src="{{t.photo.url}}">
<div><a><span onclick="test({{t.id}})" class="closeBtn">&times;</span></div></a>
</div>
{% endfor %}

网址

urlpatterns = [
     path('', views.explore, name='explore'),
     path('home/', views.home, name='home'),
     path('home/comment', views.comment, name='comment'),
     path('home/photo_del/<iddy>', views.delete_photo, name='delete_photo')
]

视图

def delete_photo(request, iddy):

    data = {'a':iddy, 'b': iddy}
    return JsonResponse(data, safe=False)

1
如果您找到了这个问题的答案,能否将您的解决方案发布为答案!我有同样的问题。 - Deepa MG
1
var patch = '{% url "delete_photo" iddy=0 %}'.replace('0',n)然后在URL中使用patch变量... type: 'post', url: patch', - Jay
1
太好了,帮了我大忙!谢谢 @Jay。 - Deepa MG
2个回答

3
你不可能做到这一点。你基本上误解了后端Django代码和前端Javascript代码之间的关系。Django模板在服务器上完全被评估,此时模板标记被转换为纯HTML文本。因此,Javascript函数(在浏览器本身上运行得多得多)无法传递参数以用于模板标记。
唯一的方法是使用虚拟值呈现URL - 你知道它不能出现在URL本身中 - 然后使用普通的JS字符串替换函数将该值替换为参数中的值。
老实说,最好从URL中删除ID。除其他外,删除操作应该是POST而不是GET - 您不希望Googlebot意外地爬取您的URL并删除所有项目 - 并且使用POST可以将ID发送到已发布的数据中。

2
谢谢!我是这样做的。 功能照片删除(n){ var patch = '{ %url“delete_photo”iddy = 0%} '.replace('0',n); $ .ajax({ type:'post', url:path, datatype:'json', 成功函数:function(data){ var foo = document.getElementById('photobox'+n); foo.style.display ='none'; }, 错误:console.log(“错误!”), }); } - Jay

-1

可能是这样的:

    <a class="closeBtn" href="{% url 'delete_photo' iddy=t.id %}" id="{{t.id}}"></a>

然后您可以使用attr检索引用:

$.ajax({ 
url: $('.closeBtn').attr("href"),
data: { "iddy": $('.closeBtn').attr("id")},
.....

})


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接