Message というモデルがあり、これには in_response_to というフィールドがあります。このフィールドを使用して、関連する各メッセージ内に元のメッセージの主キーを格納することで、どのメッセージが互いに関連しているかを識別し、すべてのメッセージを一覧表示します
あなたから新しいメッセージを受け取り、返信したい場合. テキストボックスの下にhidden_fieldを作成し、新しいメッセージのプライマリIDを保存し、それを使用してin_response_to内にプライマリキーを保存することでメッセージを作成します。これにより、このメッセージがそのメッセージに関連し、メソッドが繰り返されることがわかり、関連するすべてのメッセージが元の主キー。
だからそのような
(1) = message primary key
(s) = store message primary key inside in_response_to
John(1) send mail to Peter(s)
Peter(1) send mail to John(s)
John(1) send mail to Peter(s)
問題は、私があなたにメッセージを送った場合です。新しいメッセージであるため、in_response_to は空白です。あなたがそのメッセージに返信した場合、私の主キーを in_response_to 内に保存しますが、再度返信しようとすると. 私はそれを自分自身に送信することになります。どうしてか分かりません 。誰か助けてください。ぐるぐる走ってます
問題はここにあります
if messages.in_response_to:
if messages.user != request.user:
primary = messages.in_response_to
Message.objects.create(user=request.user,recipient=messages.user,body=body,in_response_to=primary)
return HttpResponseRedirect(reverse('world:message'))
if messages.user == request.user:
Message.objects.create(user=request.user,recipient=messages.recipient.user,body=body,in_response_to=primary)
Message.objects.create(user=request.user,recipient=messages.user,body=body,in_response_to=messages)
return HttpResponseRedirect(reverse('world:message'))
モデル
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)
subject = models.CharField(max_length=100, blank=True)
body = models.CharField(max_length=1000)
read = models.BooleanField(default=False)
trash = models.BooleanField(default=False)
sentmessage = models.BooleanField(default=False)
in_response_to = models.ForeignKey('self', null=True, blank=True)
def __unicode__(self):
return self.body
ビュー.py
@login_required
def read(request,id):
try:
messages = Message.objects.get(pk=id,recipient=request.user.id)
except Message.DoesNotExist:
return HttpResponseRedirect(reverse('world:Display'))
if request.method =='POST':
form = NewMessageForm(request.POST)
if form.is_valid():
id = request.POST.get('hidden_field', False)
try:
messages = Message.objects.get(pk=id)
except Message.DoesNotExist:
return HttpResponseRedirect(reverse('world:LoginRequest'))
body = form.cleaned_data['body']
if messages.in_response_to:
if messages.user != request.user:
primary = messages.in_response_to
Message.objects.create(user=request.user,recipient=messages.user,body=body,in_response_to=primary)
return HttpResponseRedirect(reverse('world:message'))
if messages.user == request.user:
Message.objects.create(user=request.user,recipient=messages.recipient.user,body=body,in_response_to=primary)
Message.objects.create(user=request.user,recipient=messages.user,body=body,in_response_to=messages)
return HttpResponseRedirect(reverse('world:message'))
if messages.in_response_to:
m = messages.in_response_to.id
message = Message.objects.filter(in_response_to=messages.in_response_to ).filter(created__lte=messages.created)
initial = {}
initial.update({'hidden_field': m})
form = NewMessageForm(initial=initial)
return render(request,'read.html',{'message':message,'form':form,'m':m})
initial = {}
initial.update({'hidden_field': messages.id})
form = NewMessageForm(initial=initial)
return render(request,'read.html',{'messages':messages,'form':form})
@login_required
def message(request):
form = CheckBoxForm()
messages = Message.objects.filter(recipient=request.user.id).order_by("-created")
return render(request,'messages.html',{'messages':messages,'form':form})
テンプレート
{% csrf_token %}
{{form.body}}{{form.hidden_field}}
<input type = "submit" value= "add" class="sen"/>
</form>
フォーム
class NewMessageForm(forms.Form):
body = forms.CharField(widget=forms.Textarea,required=False,max_length=22000)
hidden_field = forms.CharField(widget=forms.HiddenInput())
class Meta:
model = Message