Django消息应用程序重复错误

时间:2013-07-18 12:07:37

标签: django

我创建了一个简单的消息传递应用程序,用户可以相互发送消息。 我选择创建此消息而不是使用插件,因为它可以自由地允许我自定义代码

我创建了2个名为message和read的函数,消息函数显示所有消息,并且它有一个与之关联的复选框,允许用户删除消息对象,read函数从中捕获主键。模板,显示所有消息并获取对象并过滤该线程的所有对象。

我跟踪回复消息的方式是它们与特定的线程模型相关。 并且因为如果2个用户不断回复彼此的消息,每条消息都是时间戳,我将通过仅过滤先前的消息和该对话的最近消息来显示与该对话相关的所有消息。

这是一个棘手的问题,我很感激任何帮助我的人

我画了一张图来解释我的情况

此图片是显示所有图片的消息功能,允许用户删除自己的消息

enter image description here

这是引用第二个函数read

的图表

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"/>

如果邮件已被回复和转发,我的邮件功能会显示所有未读邮件,并允许用户删除自己的邮件。 如果他删除与正在进行的对话相关的对象,则它将影响两个用户,因为其他用户将无法读取被认为与对话相关的已删除消息。我该如何解决这个问题?

谢谢

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您希望邮件的发件人能够删除邮件,但是如果邮件尚未被阅读,则收件人仍然可以查看该邮件吗?

因此,当发起者点击删除按钮时,不要删除消息,只需删除消息已被删除。例如,在Message添加另一个字段。

is_deleted = models.BooleanField(default=False)

发起者的读取功能将在is_deleted上过滤而不显示这些消息。收件人不会在is_deleted上过滤,因此继续查看邮件。然后,您必须决定从数据存储中清除标记为is_deleted的邮件的策略。例如。也许一旦收件人读取了邮件,它就会被自动删除。

您已经有很多变量可以跟踪消息状态。也许将消息状态折叠为更少的枚举类型值是有意义的。

答案 1 :(得分:1)

Django消息不适合您正在做的事情,因为is based on cookies or sessions而不是用户。因此,消息不会存储在会话之间。

根据我的理解,现在如果有人删除了该消息,它将从数据库中删除,因此对于其他任何您不想要的内容都不可读。

我会用更简单的术语表达你的问题:

您有三个模型,用户线程和消息。每个用户都有一组线程,每个线程都有一组消息。每封邮件都有发件人和收件人。

现在,每条消息都有一组自己的属性(例如draft,body)和一组自身与发送者或接收者之间关系的属性(例如“read”不是消息本身的属性,它是收件人和邮件之间关系的属性(“收件人已阅读邮件”))。

您现在想要的也是发件人和邮件之间关系的属性(“发件人删除邮件”)。

就像你使用“read”一样,你应该有两个属性:

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

在发件人/收件人邮件的视图中,您可以检查该用户是否已删除邮件。如果他删除了该邮件,则该邮件将不再显示在其收件箱中。但是,由于邮件仍然存在,收件人/发件人(注意订单)仍然可以读取它。

可以从数据库中删除发件人和收件人都删除的邮件。因此,无论是预定作业还是删除其中一方(发件人和收件人)之后,都可以从数据库中触发消息删除。

这种方法实际上是一个更复杂方法的简化版本,您希望在其中定义两个模型(在本例中为用户和消息)的关系的一组属性,可以使用{{3在Django中创建}}