Как через AJAX запрос добавить элементы Django-шаблона
У меня есть две модели:
class GroupOfdishes(models.Model):
group = models.CharField(max_length=42, verbose_name="Группа блюд")
class Dishes(models.Model):
name = models.CharField(max_length=100, verbose_name="Наименование блюда")
mass_of_dish = models.IntegerField(verbose_name="Выход блюда")
recipe_number = models.CharField(max_length=20, verbose_name="Номер рецептуры", null = True)
picture = models.ImageField(upload_to='picture_of_dish')
group = models.ForeignKey(GroupOfdishes, on_delete=models.CASCADE)
На основе модели GroupOfdishes происходит заполнение группы выпадающих кнопок и заготовка под карусель (bootstrap)
<div class="dropdown">
<a class="btn btn-secondary dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Выберите группу блюд
</a>
<div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
{% for group in groups %}
<button class="dropdown-item" id="{{ group.pk }}">{{ group.group }}</button>
{% endfor %}
</div>
<div id="carouselReviews" class="carousel slide 1111" data-ride="carousel" data-interval="false">
<div class="carousel-inner" id="carousel-inner">
</div>
<a class="carousel-control-prev" href="#carouselReviews" role="button" data-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="carousel-control-next" href="#carouselReviews" role="button" data-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div>
Я хочу что бы по событию "клика" на button, выполнялся код Jquery (мои попытки представлены ниже):
$( document ).ready(function() {
$('button').click(function(){
event.preventDefault();
$.ajax({
method: "GET",
url: '{% url 'Ajax_request' %}',
dataType:"json",
data: { group_pk: $('button').attr('id'); },
success: function(){
$("#carousel-inner").html(data);
}
});
});
});
Код jquery выполняет Ajax запрос, который обрабатывается функцией в Views.py(я понимаю что это все овнокод, я новичок в этом, стараюсь исправиться).
Обработка url адреса:
path('ajaxrequest/', views.ajax_request, name='Ajax_request'),
Функция Views.py:
def ajax_request(request):
dishes = Dishes.objects.filter(group = request.GET.get('group_pk'))
return render(request, 'testing/dishes.html',{ 'dishes' : dishes })
Эта функция в свою очередь отрисовывает html - dishesh.html с переданным контекстом:
<div class="carousel-inner" id="carousel-inner">
{% for dish in dishes %}
{% if forloop.counter == 1 %}
<div class="carousel-item active">
{% else %}
<div class="carousel-item">
{% endif %}
<div class="row align-items-center">
<div class="col-7 offset-md-1">
<img src="{{ dish.picture.url }}" class="img-thumbnail d-block m-auto pb-3 border-0" alt="">
</div>
<div class="col-3">
<div class="review align-center">
{{ dish.name }}
</div>
</div>
</div>
</div>
{% endfor %}
</div>
и в результате Ajax запрос получает в success готовый элемент карусели, который подставляется вместо заготовки:
success: function(){
$("#carousel-inner").html(data);
}
Но это не работает по нескольким причинам:
- не происходит передачи через Ajax запрос data: { group_pk: $('button').attr('id'); },
- в качестве проверки вместо $('button').attr('id'); я подставляю готовое значение, например 2, тогда запрос передается с group_id = 2 (вижу это в терминале), но возврата готового html кода нет.