Django добавление ответных сообщений
<div class="form-group row">
<form class="reply-form" method="post" action=".">
{% csrf_token %}
<input type="hidden" name="{{ message.id }}" value="{{ message.id }}">
<div class="form-group">
<textarea name="text" cols="60" rows="2" maxlength="4096" required="" id="id_text"></textarea>
</div>
<input type="submit" value="Submit" >
</form>
</div>
Я пытаюсь использовать вышеописанное для ответа на сообщение. Как мне использовать идентификатор сообщения, чтобы добавить ответ на это сообщение из действия, используя представления?
models.py
class Messages(models.Model):
sender = models.ForeignKey(Profile,related_name='sender',on_delete=models.CASCADE)
receiver = models.ForeignKey(Profile,related_name='receiver',on_delete=models.CASCADE)
subject = models.CharField(default='',max_length=100)
text = models.CharField(default='',max_length=4096)
time = models.DateTimeField(auto_now_add=True)
read = models.BooleanField(default=False)
parent = models.ForeignKey('self', on_delete=models.CASCADE,
null=True, blank=True, related_name='contact_parent')
def get_children(self):
return Messages.objects.filter(parent=self)
def __str__(self):
return '{} to {} :{}'.format(self.sender,self.receiver,self.text)
Я создал сообщение следующим образом
class MessageForm(forms.ModelForm):
subject = forms.CharField(max_length=100, required=False, help_text='Optional.')
text = forms.CharField(max_length=4096, required=True, help_text='Required.')
class Meta:
model = Messages
fields = ('receiver','subject','text',)
views.py
elif 'sendMessage' in request.POST:
sendMessageForm = MessageForm(request.POST or None,)
if sendMessageForm.is_valid():
sendMessageFormUser = sendMessageForm.save(commit=False)
sendMessageFormUser.sender = request.user
sendMessageFormUser.save()
unreadMessagesCount = Messages.objects.filter(Q(receiver=request.user) & Q(read=False)).count()
context['unreadMessagesCount'] = unreadMessagesCount
return redirect('home')
Расширенный html для любого использования
<div class="col-md-12">
<div class="accordion" id="accordionExample">
{% for message in Inbox %}
<div class="card">
<div class="card-header" id="heading{{ forloop.counter }}">
<h5 class="mb-{{ forloop.counter }}">
<button class="btn" type="button" data-bs-toggle="collapse" data-bs-target="#collapse{{ forloop.counter }}" aria-expanded="false" aria-controls="collapse{{ forloop.counter }}">
{{ message.sender }} {{ message.subject}} {{ message.time }}
</button>
</h5>
</div>
<div id="collapse{{ forloop.counter }}" class="collapse" aria-labelledby="heading{{ forloop.counter }}" data-parent="#accordionExample">
<a id="{{ message.id }}" onclick="alert(this.id)">X</a>
<div class="card-body">
{{ message.text}}
{% if message.contact_parent.count %}
<div>
<ul>
{% for reply in message.get_children %}
<li>{{ reply.sender }}</li>
<li>{{ reply.text }}</li>
<li>{{ reply.time }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
<div class="form-group row">
<form class="reply-form" method="post" action=".">
{% csrf_token %}
<input type="hidden" name="{{ message.id }}" value="{{ message.id }}">
<div class="form-group">
<textarea name="text" cols="60" rows="2" maxlength="4096" required="" id="id_text"></textarea>
</div>
<input type="submit" value="Submit" >
</form>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
from django.views.decorators.http import require_http_methods
@require_http_methods(["POST"])
def reply(request,messageID):
print(messageID)
parent = Messages.objects.get(id=messageID)
#Not sure how the receiver is found
reply = Messages.objects.create(text=request.POST['text'], receiver=parent.sender, sender=request.user, parent=parent)
print(parent)
print(reply)
print(request.POST)
return redirect('home')
Мне просто нужен вид только для сообщений, а затем взять сообщение, которое принадлежит этому идентификатору и оттуда создать новое сообщение, которое указывает на родителя. Очевидно, что сейчас все это указывает на верхнее сообщение, а не на ответы, я думаю, я не совсем уверен.