Запрос Ajax GET возвращает текущую HTML-страницу

#javascript #json #django #ajax #django-views

Вопрос:

Привет, я создаю первый проект 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)
        }
    })
})
 

Это мой файл URL-адресов:

 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)
 

Комментарии:

1. URL — адрес должен быть sales/register/ajax_get_product в ajax, правильно?

2. вы пытаетесь ПОЛУЧИТЬ ajax_get_products и ожидаете sales/register/ajax_get_products — видите ли вы проблему?

3. [27/Июль/2021 22:06:22] «ПОЛУЧИТЬ /продажи/зарегистрировать/продажи/зарегистрировать/ajax_get_продукты? keyprod=au HTTP/1.1» 404 7354 Не найден: /продажи/регистрация/продажи/регистрация/ajax_get_продукты Это происходит, когда я изменил это на продажи/регистрация/ajax_get_продукт

4. /sales/register/sales/register возможно, это и есть причина проблемы. Это, похоже, дублируется. Пожалуйста, опубликуйте url.py также файл вашего основного проекта. Потому что с url: "/sales/register/ajax_get_products/" этим должно получиться.

5. Я прикрепил основной URL-код файла

Ответ №1:

Ваш URL sales/register/<str:new> -шаблон означает , что для него требуется строка, которая будет передана вашему представлению в качестве вызываемого параметра new , поэтому вы никогда не достигнете sales/register/ajax_get_products , потому что предыдущий путь препятствует доступу к этому. Django проверяет все шаблоны один за другим в том порядке, в котором они отображаются в URL-шаблоне. Так что вы можете попробовать некоторые варианты здесь.

Шаблон изменения порядка:

 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"),   
]
 

Это позволяет избежать конфликтов шаблонов, один из которых предназначен для визуализации новой формы, а другой-для получения продуктов.

Комментарии:

1. Отлично, я попробовал оба решения и решил проблему. Отличное объяснение, большое вам спасибо!

Ответ №2:

Основываясь на шаблонах URL, показанных в ваших ошибках Not Found: /sales/register/sales/register/ajax_get_products , отображается /продажи/регистрация/продажи/регистрация/, где это может вызвать проблему, которую вы хотите /продажи/регистрация/ajax_get_products/.

Вот что я бы предложил… На данный момент попробуйте это.

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

В вызове Ajax задайте URL-адрес как.

 url: "/ajax_get_products/",