【问题标题】:Django how to send data to django dispatcher url with AJAX?Django 如何使用 AJAX 将数据发送到 django 调度程序 url?
【发布时间】:2021-08-27 13:55:54
【问题描述】:

所以我试图在this website 中使用ajax 将类别发送到django url(通过url 访问时采用类别),但我收到了这个我似乎不明白的错误。请帮忙!

urls.py

urlpatterns=[
    path('category/<str:category>', views.getcategory, name = 'get_category'),
]

views.py:

def get_category(request, category=None):
    
    #To get category if requested via AJAX
    if request.is_ajax and request.method == "GET":
        
        category = request.GET.get("last_joke_id", category)
    
    if category!=None:
        return HttpResponse('\n Received via Json. \n')
    else:
        return HttpResponse('\n Received via URL. \n')

index.html:

<script>
function send_category(category){
  $.ajax({
    type: 'POST',
    *url:"{% url 'get_category' %}"*, /*Error in this line*/
    data: {'category':category},
    success: function(response) {
      console.log("\n\nCategory data Successfully recived.\n");
      console.log( response );
      //displayJokes(response);
    
    }, error: function (response) {
         console.log('\n\n error in retriving category data:');
         console.log(response);
         //return 'her';
       }
    
  })
}
</script>

错误信息:

<b>django.urls.exceptions.NoReverseMatch: Reverse for 'get_category' with no arguments not found. 1 pattern(s) tried: ['jokes/category/(?P[^/]+)$']</b>

【问题讨论】:

    标签: python django ajax


    【解决方案1】:

    这意味着category是你的路由中的必需参数,所以如果你改变你的路由和视图功能,你可以解决这个问题,像这样:

    urls.py

    path('category/', views.getcategory, name = 'get_category'),
    

    views.py

    def getcategory(request):
        category = request.GET.get("category")
    
        if request.is_ajax and request.method == "GET":
            category = request.GET.get("last_joke_id", category)
    
        if category!=None:
            return HttpResponse('\n Received via Json. \n')
        else:
            return HttpResponse('\n Received via URL. \n')
    

    或者你可以创建两个路由,带参数和不带参数:

    path('category/', views.getcategory, name = 'get_category_default'),
    path('category/<str:category>', views.getcategory, name = 'get_category'),
    

    然后你需要在你的函数中设置默认值:

    def get_category(request, category=None):
        ...
    

    最后,您需要在 js 代码中将 get_category 路由替换为 get_category_default

    【讨论】:

    • 哇,这行得通,......有没有办法在不改变 url-pattern 的情况下解决问题,因为同样的概念在 urlpattern 中与 一起工作得很好,例如: path('/vote/', views.vote, name='vote')
    • 如果您希望 Ajax 使 url 像 'category/your-category-name' 这样它就不会这样做,因为所有传递给 data 选项的参数都将是一个“GET”你的网址
    • 甚至不只是调用函数?
    • 你可以创建两个带参数的路由,没有它们将使用具有默认值的类别参数的相同功能
    • 感谢您的好主意!它工作得很好!
    猜你喜欢
    • 2020-03-10
    • 1970-01-01
    • 2021-10-22
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 2016-08-07
    • 2013-02-20
    相关资源
    最近更新 更多