在用户

时间:2015-09-17 10:29:56

标签: django message

我想在两个用户之间发送消息,但我有两个问题: 首先,文本区域包含消息表单,它显示HTML代码,我想隐藏HTML代码,以保持文本区域清洁。 其次,它会使用消息正文字段的名称抛出异常。 这是我的代码:

views.py

@login_required(login_url='/sn/login/')
def compose(request, email):
    send_from = UserProfile.objects.get_profile_user(request.user.email)
    send_to = UserProfile.objects.get_profile_user(email)

    if request.method == "POST":
        form = MessageForm(request.POST)
        if form.is_valid():
            form.save(send_from, sent_to, None, None)
            ...
            return HttpResponseRedirect(reverse('inbox'))
    else:
        form = MessageForm()
    return render_to_response('sn/messages/compose.html',
            {'form': form, 'user': send_to},
            context_instance=RequestContext(request)) 

forms.py

class MessageForm(forms.Form):
    body = forms.CharField(label="Introduce tu mensaje", max_length=500)

    def clean(self):
        body = self.cleaned_data['body'] # Error is in this line
        if len(body) > 0:
            raise ValidationError('No puedes enviar un mensaje vacio')
        return self.cleaned_data

    def save(self, send_from, send_to, parent_msg, replied_at):
        body = self.cleaned_data['body'] 
        message = Message(send_from = send_from,
                          send_to = send_to,
                          body = body,
                          parent_msg = parent_msg)
        message.save()
        if replied_at is not None:
            message.replied_at = replied_at
            message.save()
        return message

models.py

class Message(models.Model):
    body = models.CharField(max_length=500)
    send_from = models.ForeignKey(UserProfile, related_name='sent_messages')
    send_to = models.ForeignKey(UserProfile, related_name='received_messages', null=True, blank=True)
    parent_msg = models.ForeignKey('self', related_name='next_messages', null=True, blank=True)
    created = models.DateTimeField(default=datetime.now)
    read_at = models.DateTimeField(default=None)
    replied_at = models.DateTimeField(default=None)

compose.html

{% load i18n %} 

<form action="" method="post">{% csrf_token %} 
<h5>Escribe aqu&iacute; tu mensaje</h5>
<textarea rows="10" cols="50">
    {{ form.as_p }}
</textarea><br/>

<input type="submit" value="Enviar"/><br/>
<a href="{% url 'messages_inbox' %}">Cancelar</a><br/>
</form>

错误是: 异常类型:KeyError 例外价值:&#39; body&#39;

任何人都可以帮助我吗?谢谢!

2 个答案:

答案 0 :(得分:0)

这不是必要的:

<textarea rows="10" cols="50">
    {{ form.as_p }}
</textarea>

form.as_p将您的表单呈现为html,因此您在textarea块中呈现HTML。

compose.html应该看起来像这样:

{% load i18n %} 

<h5>Escribe aqu&iacute; tu mensaje</h5>

<form action="" method="post">{% csrf_token %} 
    {{ form.as_p }}
   <input type="submit" value="Enviar"/><br/>
   <a href="{% url 'messages_inbox' %}">Cancelar</a><br/>
</form>

如果您希望表单显示textarea,可以在MessageForm类中设置:

class MessageForm(forms.Form):
    body = forms.CharField(label="Introduce tu mensaje", max_length=500, widget=forms.Textarea)

答案 1 :(得分:-1)

在运行cleaned_data方法后填写表单中的

clean,因此您无法在clean内访问其中的数据。您可以使用clean_body方法或致电:

cleaned_data = super(MessageForm, self).clean()

并使用返回的cleaned_data代替。如果一切正常,你必须记得在你的干净方法中返回cleaned_data

相关问题