【问题标题】:Send a Message between users在用户之间发送消息
【发布时间】:2015-09-17 10:29:55
【问题描述】:

我想在两个用户之间发送消息,但有两个问题: 首先,文本区域包含消息表单,它显示 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)

撰写.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 异常值:'body'

有人可以帮助我吗?谢谢!

【问题讨论】:

  • 提交表单后是否出现错误?你能发布完整的堆栈跟踪(并检查 request.POST 的值)吗?

标签: django message


【解决方案1】:

这不是必须的:

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

form.as_p 将您的表单呈现为 html,因此您在 textareablock 内呈现 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>

如果您希望表单显示文本区域,您可以在 MessageForm 类中进行设置:

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

【讨论】:

    【解决方案2】:

    cleaned_data 在表单中是在运行clean 方法后填充的,因此您无法在clean 中访问数据。你可以做的是使用clean_body方法或调用:

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

    并改用返回的cleaned_data。此外,如果一切正常,您必须记住在您的 clean 方法中返回 cleaned_data

    【讨论】:

      猜你喜欢
      • 2012-03-06
      • 2023-01-07
      • 2020-12-18
      • 2016-03-11
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多