models.py
class Message(models.Model):
product = models.ForeignKey(Product,on_delete=models.CASCADE,null = True)
sender = models.ForeignKey(Account,on_delete=models.CASCADE,related_name="sender")
receiver = models.ForeignKey(Account,on_delete=models.CASCADE,related_name="receiver")
text = models.TextField(max_length=500)
created_at = models.DateTimeField(auto_now=True)
is_readed = models.BooleanField(default=False)
def __str__(self):
mstr = str(self.sender)+">"+str(self.receiver)+": "#+ str(self.product.title)+" "+str(self.created_at)
return mstrview.py
class MessageSend(CreateView):#Start conversation message
model = Message
template_name = "sendMessage.html"
fields = ['text']
success_url = reverse_lazy('home')
def get(self, request, *args, **kwargs):
if not request.user.is_authenticated:
return HttpResponseRedirect(reverse('home'))#giriş yapılmamışsa anasayfaya yönlendirir
if self.request.user == Account.objects.get(id=int(self.kwargs["receiver"])):
return HttpResponseRedirect(reverse('home'))#kendine mesaj atmışsa anasayfaya yönlendirir
return super().get(request, *args, **kwargs)
def form_valid(self, form):#message objesini setle
form.instance.sender = self.request.user #gönderici user
form.instance.receiver = Account.objects.get(id=int(self.kwargs["receiver"])) #find receiver
form.instance.product = Product.objects.get(product_id=int(self.kwargs["product"]))#which product
return super().form_valid(form)
class MessageDetail(CreateView):#user-user message
model = Message
template_name = "detailMessage.html"
fields = ['text']
success_url = reverse_lazy('home')
def get_context_data(self, **kwargs):
kwargs['object_list'] = Message.objects.filter(
receiver=self.request.user, sender=int(self.kwargs["receiver"])) | Message.objects.filter(
receiver=int(self.kwargs["receiver"]),sender=self.request.user).order_by('created_at')
return super().get_context_data(**kwargs)
def get(self, request, *args, **kwargs):
if not request.user.is_authenticated:
return HttpResponseRedirect(reverse('home'))
return super().get(request, *args, **kwargs)
def form_valid(self, form):#message objesini setle
form.instance.sender = self.request.user #gönderici user
form.instance.receiver = Account.objects.get(id=int(self.kwargs["receiver"])) #find receiver
return super().form_valid(form)
class MessageBox(ListView): #bu viewde mesajları listeliyoruz
model = Message #sender-receiverleri ayırt ediyoruz
template_name = "messageBox.html"
ordering = "created_at"
def get_queryset(self):
allMessages = Message.objects.filter(sender = self.request.user) | Message.objects.filter(receiver = self.request.user)
allMessages = allMessages.order_by('-created_at')#ilgili tüm mesajları al ve sırala
queryset = Message.objects.none()#yeni bir queryset oluştur
users=[]
for mObject in allMessages:
if mObject.receiver.id == self.request.user.id:#en son mesajı tespit etmek amaçlı
if mObject.sender.id not in users:#tekrar eden kullanıcıları geç
users.append(mObject.sender.id)
queryset |= allMessages.filter(id = mObject.id)#query'e ekle
else:#eger user receiver değilse sender olur
if mObject.receiver.id not in users:
users.append(mObject.receiver.id)
queryset |= allMessages.filter(id = mObject.id)
return querysetdetail message template:
{% for message in object_list %}
{% if message.sender.id == user.id %}
<div class="float-right">{{ message.text }}<i> {{ message.created_at|date:"m/d/y H:i" }}</i></div><br>
{% else %}
<div class="float-left">{{ message.text }}<i> {{ message.created_at|date:"m/d/y H:i" }}</i></div><br>
{% endif %}
{% endfor %}
<form method="post">
{% csrf_token %}
{{ form|crispy }}
<input type="submit" value="SEND">
</form>send message template:
<form method="post">
{% csrf_token %}
{{ form|crispy }}
<input type="submit" value="SEND">
</form>message box template:
{% for message in object_list %}
{% if message.sender.id == user.id %}
<!--- Mesaj gönderen kullanıcı ise alıcı ismini göster self.user.id ile de kullanıcının adına ulaşıyoruz -->
<a href={% url 'detail-message' receiver=message.receiver.id %}>
<h1>{{ message.receiver }}</h1></a>
<h4>{{ message.text }}</h4>
{% else %}
<!-- eğer alıcı user ise göndereni yazdır -->
<a href={% url 'detail-message' receiver=message.sender.id %}>
<h1>{{ message.sender }}</h1></a>
<h4>{{ message.text }}</h4>
{% endif %}
{% endfor %}

Bir yanıt yazın