1

ユーザーが互いにメッセージを送信できる単純なメッセージング アプリケーションを作成しました。コードを自由にカスタマイズできるので、プラグインを使用する代わりにこのメッセージを作成することにしました。

メッセージと読み取りと呼ばれる 2 つの関数を作成しました。メッセージ関数はすべてのメッセージを表示し、ユーザーがメッセージ オブジェクトを削除できるようにチェック ボックスが関連付けられており、読み取り関数はすべてのメッセージを表示するテンプレートから主キーをキャプチャします。オブジェクトを取得し、そのスレッドのすべてのオブジェクトをフィルタリングします。

返信されたメッセージを追跡する方法は、それらが特定のスレッド モデルに関連していることです。2 人のユーザーがお互いにメッセージに返信し続けた場合、各メッセージはタイム スタンプであるため、その会話の前のメッセージと最近のメッセージのみをフィルター処理して、その会話に関連するすべてのメッセージを表示します。

ここにトリッキーな問題があります。私を助けてくれる人に感謝します

自分の状況を説明する図を描いた

この画像は、すべての画像を表示し、ユーザーが自分のメッセージを削除できるようにするメッセージ機能です。

ここに画像の説明を入力

これは、read という 2 番目の関数を参照する図です。

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

メッセージが前後に返信され、私のメッセージ機能がすべての未読メッセージを表示し、ユーザーが自分のメッセージを削除できるようにする場合。彼が進行中の会話に関連するオブジェクトを削除すると、他のユーザーは会話に関連すると思われる削除されたメッセージを読むことができなくなるため、両方のユーザーに影響を与えます。どうすればこれを解決できますか?

ありがとうございました

4

2 に答える 2

1

あなたの質問を正しく理解できれば、メッセージの発信者はメッセージを削除できるようにしたいのですが、受信者はまだ読んでいない場合でもそのメッセージを表示できるようにしたいですか?

したがって、発信者が削除ボタンを押したときにメッセージを削除する代わりに、メッセージが削除されたことを示す削除マークを付けます。例: に別のフィールドを追加しますMessage

is_deleted = models.BooleanField(default=False)

is_deleted発信者の読み取り機能は、これらのメッセージをフィルター処理して表示しません。受信者はフィルター処理を行わないis_deletedため、引き続きメッセージが表示されます。次に、 とマークされたメッセージをデータ ストアから消去するポリシーを決定する必要がありますis_deleted。例えば。おそらく、メッセージが受信者によって読まれると、自動的に削除される可能性があります。

メッセージの状態を追跡するかなりの数の変数が既にあります。おそらく、メッセージの状態をより少ない列挙型の値に折りたたむことは理にかなっています。

于 2013-07-18T12:42:51.933 に答える