Как выбрать определенный элемент HTML из цикла for в шаблоне Django?
Я пытаюсь создать кнопку, которая скрывает и отображает только определенные элементы HTML
, которые находятся в одном div с ней через JavaScript
. Все div находятся внутри шаблона Django
для цикла и отображают различную информацию. Сейчас я использую querySelector
для выбора id, но это неправильно, потому что выбирается первый элемент, который он находит с этим id.
<div>
{% for post in page_obj.object_list %}
<div class = "individual_posts">
<a href="{% url 'username' post.user %}"><h5 id="p_user" class = "post_user">{{ post.user }}</h5></a>
<h6 id = "post_itself">{{ post.post }}</h6>
<h6 id="date_and_time" class = "post_elements">{{ post.date_and_time }}</h6>
<h6 id="likes" class = "post_elements">{{ post.likes }}👍</h6>
{% if post.user == request.user %}
<button class="edit_button" value="{{ post.id }}">Edit</button>
{% endif %}
<textarea class="textarea" id="edit_area"></textarea>
<button class="edit_save" id="save">Save</button>
</div>
{% endfor %}
</div>
javascript
:
document.addEventListener('DOMContentLoaded', function(){
//hide the textarea
const editingTextareas = document.querySelectorAll(".textarea");
for (const textarea of editingTextareas){
textarea.style.display = 'none';
}
//hide the save buttons for the textarea
const saveButtons = document.querySelectorAll(".edit_save");
for (const s_button of saveButtons){
s_button.style.display = 'none';
}
//adds the click to the edit buttons
const editButtons = document.querySelectorAll('.edit_button');
for (const button of editButtons) {
id = button.value;
button.addEventListener('click', () => edit_email(id));
}
});
function edit_email(id){
document.querySelector('#post_itself').style.display = 'none';
document.querySelector('#date_and_time').style.display = 'none';
document.querySelector('#likes').style.display = 'none';
const edit_area = document.querySelector('#edit_area');
edit_area.style.display = 'block';
const save = document.querySelector('#save');
save.style.display = 'block';
//get post
fetch(`/edit/${id}`)
.then(response => response.json())
.then(post => {
edit_area.innerHTML = `${post.post}`;
})
//save the post
fetch(`/edit/${id}`,{
method: 'POST',
post: JSON.stringify({
post: edit_area.value
})
})
}
Придется ли мне прогонять каждый элемент HTML
через цикл for, как это делается при первой загрузке DOM
, чтобы скрыть кнопки?
Вы используете один и тот же идентификатор для нескольких элементов. Согласно MDN,
Метод документа querySelector() возвращает первый элемент в документе, который соответствует указанному селектору или группе селекторов
.
Чтобы исправить это в вашем случае, добавьте ID поста к ID элемента, чтобы каждый ID был уникальным и мог быть запрошен отдельно. Например, <h6 id = "post_itself-{{post.id}}">{{ post.post }}</h6>
, тогда на стороне JS должно быть:
document.querySelector(`#post_itself-${id}`).style.display = 'none';
Сделайте это для всех повторяющихся идентификаторов. Я посоветую вам хранить элемент в переменной, чтобы вам не пришлось многократно запрашивать один и тот же элемент
const postItselfEl = document.querySelector(`#post_itself-${id}`)