Я получил это работает, наконец.
Вот мой ответ:
views.py
class InboxCompany(generic.UpdateView):
model = CandidateToJob
template_name = 'dashboard/inbox-company.html'
form_class = ComposeMessage
def get_success_url(self):
return reverse('inboxcompany', kwargs={'pk': self.object.pk})
def get_context_data(self, **kwargs):
context = super(InboxCompany, self).get_context_data(**kwargs)
context['message_list'] = Message.objects.inbox_for(self.request.user)
context['sent_list'] = Message.objects.outbox_for(self.request.user)
return context
def get_initial(self, *args, **kwargs):
recipient = self.get_object(queryset=CandidateToJob.objects.select_related('candidate.user.id'))
self.initial = {'recipient': recipient}
return self.initial
def get_form_kwargs(self, *args, **kwargs):
kwargs = {'initial': self.get_initial()}
return kwargs
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
#get data from the form
data = form.cleaned_data
body = data['body']
#auto fill fields
sender = request.user
sent_at = timezone.now()
recipient = self.get_object(queryset=CandidateToJob.objects.select_related('candidate.user.id'))
user = User.objects.all().get(id=recipient.candidate.user.id)
a = Message.objects.create(sender=sender, recipient=user, sent_at=sent_at, body=body)
a.save()
return HttpResponse('Success')
forms.py
class ComposeMessage(forms.Form):
recipient = forms.CharField(
required=True,
widget=forms.HiddenInput(attrs={'class': 'form-control'})
)
body = forms.CharField(
required=True,
label="Mensagem",
widget=forms.TextInput(attrs={'class': 'form-control'})
)
def __init__(self, *args, **kwargs):
recipient_filter = kwargs.pop('recipient_filter', None)
super(ComposeMessage, self).__init__(*args, **kwargs)
if recipient_filter is not None:
self.fields['recipient']._recipient_filter = recipient_filter
def save(self, sender, parent_msg=None):
recipients = self.cleaned_data['recipient']
body = self.cleaned_data['body']
message_list = []
for r in recipients:
msg = Message(
sender = sender,
recipient = r,
subject = subject,
body = body,
)
if parent_msg is not None:
msg.parent_msg = parent_msg
parent_msg.replied_at = datetime.datetime.now()
parent_msg.save()
msg.save()
message_list.append(msg)
if notification:
if parent_msg is not None:
notification.send([sender], "messages_replied", {'message': msg,})
notification.send([r], "messages_reply_received", {'message': msg,})
else:
notification.send([sender], "messages_sent", {'message': msg,})
notification.send([r], "messages_received", {'message': msg,})
return message_list
models.py
class Message(models.Model):
"""
A private message from user to user
"""
body = models.TextField(_("Mensagem"))
sender = models.ForeignKey(AUTH_USER_MODEL, related_name='sent_messages')
recipient = models.ForeignKey(AUTH_USER_MODEL, related_name='received_messages', null=False, blank=True)
parent_msg = models.ForeignKey('self', related_name='next_messages', null=True, blank=True)
sent_at = models.DateTimeField(null=True, blank=True)
Сообщение ясно о проблема. Вы пытаетесь присвоить 'Пользователь'' Charfield', который не имеет смысла. Помните, что ваше поле 'receipient' является внешним ключом (я предполагаю), поэтому оно представлено в вашей таблице« Message »целым значением. Поэтому поле формы, представляющее отношение внешних ключей, должно также возвращать целое число. Вы хотите, чтобы пользователь мог ввести имя пользователя в поле формы и просмотреть его и сохранить в качестве «получателя»? –
Спасибо за быстрый ответ Тимми. Я не хочу, чтобы пользователь вводил имя пользователя в поле получателя. даже если я изменяю имя пользователя для id, он возвращает ту же ошибку. –
Что вы пытаетесь сделать с формой? Вы пытаетесь предварительно заполнить поле «получатель» пользователем, затем подтвердите его и сохраните в поле «получатель» при отправке формы? –