#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/",