【问题标题】:Ajax GET request returns current HTML pageAjax GET 请求返回当前 HTML 页面
【发布时间】:2021-10-03 18:26:25
【问题描述】:

嗨,我正在构建 Django 的第一个项目。 当用户输入关键字时,我使用 ajax 来更新产品

这是我的 HTML:

<form id="productform" method="GET">{% csrf_token %}
            <label>Producto:</label>
            <div class="input-group">
                <span class="input-group-label"><i class="fi-magnifying-glass"></i></span>
                <input type="text" class="input-group-field" placeholder="Buscar.." id="keyprod" name="keyprod">
            </div>
</form>

提交表单时这是我的 JS:

$("#productform").submit(function (e) {
    e.preventDefault();
    var keyprod = $("#keyprod").val();
    $.ajax({
        type: 'GET',
        url: "ajax_get_products",
        data: {"keyprod": keyprod},
        success: function (response) {
            var sel = $("#productselect");
            sel.empty();
            console.log(response)
            for (var p in response) {
                sel.append('<option value="' + response[p]["id"] + '">' + response[p]["full_name"] + '</option>');
            }

        },
        error: function (response) {
            console.log(response)
        }
    })
})

这是我的网址文件:

app_name = "sales_app"

urlpatterns = [

    path(
        'sales/register/',
        views.LoadCurrentSaleInfo.as_view(),
        name='sale-register',
    ),
    path(
        'sales/register/<str:new>',
        views.LoadCurrentSaleInfo.as_view(),
        name='sale-register',
    ),
    path('sales/register/ajax_get_products',
         ajax_get_products, name="ajax_get_products"),   
]

最后这是我认为的代码:

def ajax_get_products(request):
    
    print("Im in ajax request") --> This is never shown

    if request.is_ajax and request.method == "GET":
        keyprod = request.GET.get("keyprod", None)
        products = Product.objects.search_key_word(keyprod, 'name')
        serializer = ProductSerializer(products, many=True)
        return JsonResponse(serializer.data, safe=False, status=200)

    return JsonResponse({}, status=400)

当我在我的 JS 方法的控制台中打印响应时,将打印正在提交表单的当前 html 页面。我在做什么错任何想法? 谢谢!

我也附上我的主 url 文件:

urlpatterns = [
    path('admin/', admin.site.urls),
    # users app
    re_path('', include('applications.users.urls')),
    re_path('', include('applications.home.urls')),
    re_path('', include('applications.clients.urls')),
    re_path('', include('applications.providers.urls')),
    re_path('', include('applications.products.urls')),
    re_path('', include('applications.sales.urls')),

] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

【问题讨论】:

  • ajax GET中的url应该是sales/register/ajax_get_product吧?
  • 你尝试 GET ajax_get_products 并期待 sales/register/ajax_get_products - 你能看到问题吗?
  • [27/Jul/2021 22:06:22] "GET /sales/register/sales/register/ajax_get_products?keyprod=au HTTP/1.1" 404 7354 未找到:/sales/register/ sales/register/ajax_get_products 当我将其更改为 sales/register/ajax_get_products 时会发生这种情况
  • /sales/register/sales/register 可能是导致问题的原因。这似乎是重复的。请同时发布您的主要项目的url.py 文件。因为url: "/sales/register/ajax_get_products/" 应该可以工作。
  • 我已附上主url文件代码

标签: javascript json django ajax django-views


【解决方案1】:

您的 urlpattern sales/register/&lt;str:new&gt; 意味着它需要一个字符串,该字符串将作为名为 new 的参数传递给您的视图,因此您将永远无法到达 sales/register/ajax_get_products,因为之前的路径阻止了到达此路径。 Django 按照出现在 urlpattern 中的顺序对所有模式进行一一测试。所以你可以在这里尝试一些选项。

重新排序模式:

urlpatterns = [
    path(
        'sales/register/',
        views.LoadCurrentSaleInfo.as_view(),
        name='sale-register',
    ),
    path('sales/register/ajax_get_products',
         ajax_get_products, name="ajax_get_products"),
    path(
        'sales/register/<str:new>',
        views.LoadCurrentSaleInfo.as_view(),
        name='sale-register',
    ),   
]

这将确保ajax_get_products 的模式将首先被测试,然后它会回退到另一个模式。

改变图案:

urlpatterns = [
    path(
        'sales/register/',
        views.LoadCurrentSaleInfo.as_view(),
        name='sale-register',
    ),
    path(
        'sales/register/new',
        views.LoadCurrentSaleInfo.as_view(),
        name='sale-register',
    ),
    path('sales/register/ajax_get_products',
         ajax_get_products, name="ajax_get_products"),   
]

这避免了模式的冲突,一个用于渲染新表单,另一个用于获取产品。

【讨论】:

  • 太好了,我尝试了两种解决方案并解决了问题。很好的解释,非常感谢!
【解决方案2】:

根据您的错误中显示的 url 模式 Not Found: /sales/register/sales/register/ajax_get_products 显示 /sales/register/sales/register/ 这可能会导致问题您想要的是 /sales/注册/ajax_get_products/

这是我的建议...暂时试试这个。

path('ajax_get_products/', ajax_get_products, name="ajax_get_products"),

在 Ajax 调用中将 url 设置为。

url: "/ajax_get_products/",

【讨论】:

    猜你喜欢
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    相关资源
    最近更新 更多