2014-11-08 4 views
1

Почему я получаю эту ошибку?Django Невозможно назначить «u'username»: «Message.recipient» должен быть экземпляром «Пользователь»

Я не знаю, как избавиться от этой ошибки. Как я могу очистить поле формы, чтобы активировать имя пользователя?

Заранее спасибо.

class InboxCompany(generic.UpdateView): 

    model = CandidateToJob 
    template_name = 'dashboard/inbox-company.html' 
    form_class = ComposeMessage 

    def get(self, *args, **kwargs): 
     recipient = self.get_object(queryset=CandidateToJob.objects.select_related('candidate')) 
     if recipient is not None: 
      user = User.objects.get(username=recipient.candidate.user.username) 
      self.initial = {'recipient': user} 
     return super(InboxCompany, self).get(*args, **kwargs) 

forms.py

class ComposeMessage(ModelForm): 
    recipient = forms.CharField(
     required=True, 
     widget=forms.TextInput(attrs={'class': 'form-control'}) 
    ) 
    body = forms.CharField(
     required=True, 
     widget=forms.TextInput(attrs={'class': 'form-control'}) 
    ) 

    class Meta: 
     model = Message 
+2

Сообщение ясно о проблема. Вы пытаетесь присвоить 'Пользователь'' Charfield', который не имеет смысла. Помните, что ваше поле 'receipient' является внешним ключом (я предполагаю), поэтому оно представлено в вашей таблице« Message »целым значением. Поэтому поле формы, представляющее отношение внешних ключей, должно также возвращать целое число. Вы хотите, чтобы пользователь мог ввести имя пользователя в поле формы и просмотреть его и сохранить в качестве «получателя»? –

+0

Спасибо за быстрый ответ Тимми. Я не хочу, чтобы пользователь вводил имя пользователя в поле получателя. даже если я изменяю имя пользователя для id, он возвращает ту же ошибку. –

+0

Что вы пытаетесь сделать с формой? Вы пытаетесь предварительно заполнить поле «получатель» пользователем, затем подтвердите его и сохраните в поле «получатель» при отправке формы? –

ответ

0

Я получил это работает, наконец.

Вот мой ответ:

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)