AJAX выбирает только идентификатор первого элемента в цикле DJANGO
AJAX выбирает только идентификатор первого элемента в цикле DJANGO.
Везде, где я нажимаю кнопку "редактировать", он возвращает содержимое первого сообщения. Я использовал подобную методологию в других функциях (например, кнопка "like"), но в этой я не понимаю, почему она выбирает только верхний элемент цикла в каждом шаблоне. Пожалуйста, помогите.
Вот что я придумал на данный момент:
jS:
//Edit
$('.editfunction').click(function(){
event.preventDefault()
var post_pk;
var content = $('.textarea_edit').val();
post_pk = $(this).data("post_pk");
$.ajax({
type: "POST",
url: `/post/${post_pk}/edit`,
data: {
csrfmiddlewaretoken: document.getElementsByName('csrfmiddlewaretoken')[0].value,
post_id: post_pk,
textarea: content
},
success: function(data) {
$('.modal-edit').modal('hide')
var content = $('.textarea_edit').val()
$(`.post-object-content${post_pk}`).html(content)
}
})
})
FOR loop:
{% for post in paginated_posts %}
<div style="padding: 10px;" id="{{post.id}}">
<div style="padding: 10px; border: 1px solid;">
<p>
<h4><a href="{% url 'post_view' post.pk %}">{{ post.title }}</a></h4>
</p>
<p style="display: inline-flex;">
{% if post.author.profile.id %}
by: <span style="font-weight: bold;"><a href="{% url 'profile_class' post.author.profile.id %}"> {{ post.author }} </a></span>
{% else %}
by: <span style="font-weight: bold;"> {{ post.author }} </span>
{% endif %}
on {{ post.creation_date }}
</p>
<h5 class="card-text post-object-content{{post.id}}">{{ post.post_text }}</h5>
<!-- Edit -->
{% if user.is_authenticated %}
{% if user.id == post.author.id %}
<!-- Button modal edit-->
<small><a href="{% url 'post_view' post.pk %}">[Edit]</a></small>
<!-- Modal EDIT -->
<div class="modal fade modal-edit" id="edit" role="dialog">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content new-post-content">
<div class="modal-header">
<h5 class="modal-title">Edit post {{ post.id }}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<form method=post action="{% url 'edit' post.pk %}">
{% csrf_token %}
<textarea rows="10" class="form-control textarea_edit" name="textarea">{{post.post_text}}</textarea>
<br>
<div class="modal-footer">
<button class="btn btn-primary save editfunction" data-post_pk="{{ post.pk }}" type="submit" value="Save">Submit</button>
</div>
</form>
</div>
</div>
</div>
</div>
{% endfor %}
Ваша проблема кроется здесь:
var content = $('.textarea_edit').val();
К сожалению, это работает так, как задумано. Если есть несколько членов селектора класса, .val() будет захватывать первый элемент списка классов с таким именем (см. https://api.jquery.com/val/ для подробностей)
если вы хотите сделать что-то с каждым из значений textarea этого класса, вы можете поместить их в массив с помощью процесса, подобного:
var content = []
$('.textarea_edit').each(function(){
content.push($(this).val());
});