2013-07-18 3 views
1

Я создал простое приложение для обмена сообщениями, в котором пользователи могут отправлять друг другу сообщения. я выбрал, чтобы создать это сообщение вместо того, чтобы использовать плагин, потому что она свободно позволяет мне настроить кодОшибка дублирования сообщений Django Message

Я создал 2 функции, вызываемые сообщения и читать, функция сообщений отображает все сообщения и имеет флажок, связанные с его помощью, чтобы позволить пользователю удалить объект сообщения, а функция чтения захватывает первичный ключ из шаблона, который отображает все сообщения и получает объект и фильтрует все объекты для этого потока.

Как я отслеживаю ответные сообщения, они связаны с конкретной моделью потока. и поскольку каждое сообщение является отметкой времени, если 2 пользователя ответили друг другу на сообщения, я бы показал все сообщения, связанные с этим разговором, путем фильтрации только предыдущих сообщений и последнего сообщения для этого разговора.

Вот сложная проблема, и я благодарен за тех, кто помогает мне

Я нарисовал схему, чтобы объяснить мое положение

Эта фотография является функция сообщения, которое отображает всю картину и позволяют пользователю удалить свое сообщение

enter image description here

Это схема со ссылкой на вторую функцию, называемую чтения

http://s21.postimg.org/ribpiuwnb/image.jpg

class Thread(models.Model): 
    subject = models.CharField(max_length=100, blank=True) 
    user = models.ForeignKey(User) 


class Message(models.Model): 
    user = models.ForeignKey(User, related_name='sender') 
    recipient = models.ForeignKey(User, related_name='recipient') 
    created = models.DateTimeField(auto_now_add=True) 
    body = models.CharField(max_length=1000) 
    read = models.BooleanField(default=False) 
    sentmessage = models.BooleanField(default=False) 
    thread = models.ForeignKey(Thread) 
    draft = models.BooleanField(default=False) 

просмотров

@login_required 
def message(request):  
    messages = Message.objects.filter(recipient=request.user).order_by("-created") 
    person = Person.objects.get(user=request.user) 
    if request.method =='POST': 
     delete_list = request.POST.get('hidden_field', False) 
     if delete_list: 
      values = [int(i) for i in delete_list.split("~")] 
      m = Message.objects.filter(pk__in=values) 
      m = m.filter(recipient=request.user) 
      m.delete() 
      return HttpResponseRedirect(reverse('world:message')) 

    return render(request,'messages.html',{'messages':messages,'person':person}) 


@login_required 
def read(request,id): 

    try: 
     messages = Message.objects.get(pk=id,recipient=request.user) 
    except Message.DoesNotExist: 
     return HttpResponseRedirect(reverse('world:Display')) 
    messages.unread = True 
    messages.save() 
    if request.method =='POST': 
     form = ReplyForm(request.POST) 
     if form.is_valid(): 
      id = request.POST.get('hidden_field', False) 
      try: 
       messages = Message.objects.get(pk=id ,recipient=request.user) 

      except Message.DoesNotExist or Thread.DOesNotExist: 
       return HttpResponseRedirect(reverse('world:LoginRequest')) 


      body = form.cleaned_data['body'] 

      Message.objects.create(user=request.user,recipient=messages.user,body=body,thread=messages. thread,sentmessage=True,read=True) 
      return HttpResponseRedirect(reverse('world:message')) 

    message = Message.objects.filter(thread=messages.thread).filter(created__lte=messages.created) 
    person = Person.objects.get(user=request.user) 

    initial = {} 
    initial.update({'hidden_field': messages.id}) 
    form = ReplyForm(initial=initial) 

    return render(request,'read.html',{'messages':messages,'form':form,'message':message,'person':person}) 

message.html

<form method="POST" > 
{% csrf_token %} 

{% for m in messages %} 


<a class="theLink" href="{% url "world:read" m.id %}" > 

<div class="username">{{m.user.username}}</div></a> 
<div class="description">{{m.body}}</div><div id="container"> </div> 
<input type="checkbox" value="{{m.id}}" class="messages id_check" > 





<input type="hidden" value="" id="hidden_field" name="hidden_field" /> 
<input type = "button" id="deleteBttn" value= "Delete" class="box21"/> 
{% endfor %} 
</form> 

</div> 

read.html

{% for m in message %} 

<div class="wrapper"> 
<div class="user">{{m.user.username}} </div> 
<div class="message">{{m.body}}</div> 
</div> 

{% endfor %} 


<form method="POST" >{% csrf_token %} 
{{form.body}}{{form.hidden_field}} 
    <input type = "submit" value= "send" class="sen"/> 

</form> 
    <input type = "submit" value= "save" class="save"/> 

Если сообщения были ответил назад и вперед, и моя функция сообщения отображает все непрочитанные сообщения, а также позволяет пользователю удалить свое собственное сообщение. Если он удалит объект, связанный с продолжающимся разговором, его действие будет действовать для обоих пользователей, потому что другой пользователь не сможет прочитать удаленное сообщение, которое предположительно будет связано с разговором. Как я могу это решить?

Спасибо

ответ

1

Если я правильно понимаю ваш вопрос, вы хотите, чтобы составитель сообщения, чтобы иметь возможность удалить сообщение, но для получателя по-прежнему иметь возможность просматривать это сообщение, если оно не имеет еще были прочитаны?

Таким образом, вместо удаления сообщения, когда отправитель нажимает кнопку удаления, просто отметьте отметку удаления, которую сообщение удалило. например, добавьте другое поле в ваш Message.

is_deleted = models.BooleanField(default=False) 

функция чтения оригинатора затем фильтровать по is_deleted и не отображать эти сообщения. Получатель не будет фильтровать по is_deleted и поэтому продолжать просматривать сообщения.Затем вам нужно будет принять решение о политике для очистки сообщений из хранилища данных, которые помечены как is_deleted. например. Возможно, после того, как сообщение будет прочитано получателем, оно может быть автоматически удалено.

У вас уже есть немало переменных, отслеживающих состояние сообщений. Возможно, имеет смысл свернуть состояние сообщения до меньшего количества перечисленных значений типа.

+0

В теме? Из того, что я понял, должно быть сообщение. –

+0

@ J.C.Leitão Упс, ты прав. Я отредактирую исправление. –

+0

спасибо, что помог мне. Я ценю каждую секунду за вашу доброту. Я просто исправляю это сейчас – JackRoster

1

Сообщения Django не подходят для того, что вы делаете, потому что оно is based on cookies or sessions, но не для пользователей. Таким образом, сообщения не сохраняются между сеансами.

Из того, что я понял, теперь, если кто-то удаляет сообщение, он удаляется из базы данных и, таким образом, становится нечитаемым для кого-либо, чего вы не хотите.

вложу вашу проблему в более простых условиях:

У вас есть три модели, пользователь потоки и сообщения. Каждый пользователь имеет набор потоков, и каждый поток имеет набор сообщений. Каждое сообщение имеет отправителя и получателя.

Теперь каждое сообщение имеет набор собственных атрибутов (например, черновик, тело) и набор атрибутов отношения между собой и отправителем или получателем (например, «чтение» не является атрибутом самого сообщения, оно является атрибутом отношения между получателем и сообщением («получатель прочитал сообщение»)).

Теперь вы также являетесь атрибутом отношения между отправителем и сообщением («отправитель удалил сообщение»).

Как вы сделали с «чтением», вы должны иметь два атрибута:

is_deleted_by_sender = models.BooleanField(default=False) 
is_deleted_by_recipient = models.BooleanField(default=False) 

В отправителе/​​просмотреть сообщения получателей, вы проверяете удалил что ли пользователь сообщения или нет. Если он удалил сообщение, он больше не отображается в папке «Входящие». Однако, поскольку сообщение все еще существует, получатель/отправитель (уведомление о заказе) все еще может его прочитать.

Сообщения, удаленные как отправителем, так и получателем, могут быть удалены из базы данных. Таким образом, либо запланированное задание, либо после удаления одной из сторон (отправителя и получателя) может инициировать удаление сообщения из базы данных.

Этот подход на самом деле является упрощенной версией более сложного подхода, по которому вы хотите определить набор атрибутов отношения двух моделей (в данном случае пользователя и сообщения), которые могут быть сделаны в Django, используя through.

+0

Я хочу поблагодарить вас за помощь. Я вернусь к вам, как только я исправлю эту проблему – JackRoster

Смежные вопросы