Как сделать итерацию переменной шаблона django в выбранном элементе jQuery?
Я работаю над системой чата, в которой я могу открыть несколько чатов пользователей (как в facebook). Когда пользователь нажимает на имя пользователя, которое находится в списке контактов, открывается всплывающее окно чата.
Ниже приведен фрагмент из моего models.py,
class ThreadManager(models.Manager):
def by_user(self, **kwargs):
user = kwargs.get('user')
lookup = Q(first_person=user) | Q(second_person=user)
qs = self.get_queryset().filter(lookup).distinct()
return qs
class Thread(models.Model):
first_person = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='thread_first_person')
second_person = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
related_name='thread_second_person')
updated = models.DateTimeField(auto_now=True)
timestamp = models.DateTimeField(auto_now_add=True)
objects = ThreadManager()
class Meta:
unique_together = ['first_person', 'second_person']
class ChatMessage(models.Model):
thread = models.ForeignKey(Thread, null=True, blank=True, on_delete=models.CASCADE, related_name='chatmessage_thread')
user = models.ForeignKey(User, on_delete=models.CASCADE)
message = models.TextField()
timestamp = models.DateTimeField(auto_now_add=True)
Ниже приведен запрос, который я передаю из файла views.py в мой html-шаблон,
threads = Thread.objects.by_user(user=request.user).prefetch_related('chatmessage_thread')
Ниже приведен html-код,
<div class="chat_box">
<div class="chat_header" >
<h1 class="chat_heading">(6) Contacts</h1>
</div>
<hr>
<div class="chat_content" style="display: none;">
{% for thread in Threads %}
<div class="user" id="{{ thread.second_person.id }}" thread-id = "{{thread.id}}" chat-id="chat_{{ thread.id }}">
<img id="my_img" src="{{user_personal.picture.url}}" class="user_icon">
{% if thread.first_person == user %}
<h3 class="username">{{ thread.second_person.first_name }} {{ thread.second_person.last_name }}</h3>
{% else %}
<h3 class="username">{{ thread.first_person.first_name }} {{ thread.first_person.last_name }}</h3>
{% endif %}
<i class="fa fa-circle"></i>
</div>
{% endfor %}
</div>
</div>
Ниже приведен код jquery,
$(".user").click(function(){
var userID = $(this).attr("id");
var threadid = $(this).attr("thread-id");
var username = $(this).children().text();
profile_pic = $('#my_img').attr('src');
if ($.inArray(userID, arr) != -1)
{
arr.splice($.inArray(userID, arr), 1);
}
arr.unshift(userID);
chatPopup = '<div class="message_box" style="right:290px" rel="'+ userID+'" thread-id="'+threadid+'"><div class="message_header" rel="'+ userID+'">'+
'<img src="http://127.0.0.1:8000'+profile_p+'" class="user_icon"><h3 class="username">'+username+'</h3>'+
'<i class="fa fa-times close" rel="'+ userID+'"></i></div><hr><div class="message_content"><div class="messages" rel="'+ userID+'">'+
'<div class="chat">'+
'{% for thread in Threads %}{% for chat_i in thread.chatmessage_thread.all %}'+
'{% if thread.first_person.id == user.id and thread.second_person.id == 3 %}'+
'{% if thread.id == chat_i.thread_id %}'+
'{% if chat_i.user == user %}'+
'<div class="new_messages p2"><p>{{ chat_i.message }}</p></div>'+
'{% else %}'+
'<div class="new_messages p1"><p>{{ chat_i.message }}</p></div>'+
'{% endif %}{% endif %}{% endif %}{% endfor %}{% endfor %}</div></div><div class="input_box">'+
'<textarea type="text" class="message_input" rel="'+ userID+'" placeholder="Type Message..."></textarea>'+
'<i class="fa fa-arrow-circle-right enter" rel="'+ userID+'"></i></div></div></div>';
if ( $('[rel="'+userID+'"]').length == 0) {
$("body").append( chatPopup );
console.log(chatPopup);
displayChatBox();
}
});
Функциональные возможности на стороне клиента работают абсолютно нормально, но я не могу итерировать сообщения чата на основе определенного id потока. Сообщения отображаются на всех всплывающих окнах чата.
Я очень сильно застрял в этом с прошлой недели. Пожалуйста, помогите мне избавиться от этого и спасти мою жизнь. Спасибо.
Попробуйте вставить цикл через chatmessage_thread
после оператора if.
Второй оператор if if thread.id == chat_i.thread_id
всегда корректен и бесполезен, так как вы получаете chat_messages
из этого thread
. Опустите его и вставьте цикл после первого if (if thread.first_person.id == user.id and thread.second_person.id == 3
)