我想在两个用户之间发送消息,但我有两个问题: 首先,文本区域包含消息表单,它显示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í 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;
任何人都可以帮助我吗?谢谢!
答案 0 :(得分:0)
这不是必要的:
<textarea rows="10" cols="50">
{{ form.as_p }}
</textarea>
form.as_p
将您的表单呈现为html,因此您在textarea
块中呈现HTML。
compose.html应该看起来像这样:
{% load i18n %}
<h5>Escribe aquí 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
。