我正在尝试创建一个用户可以互相发送消息的应用程序。
我正在处理的函数叫做read,允许用户阅读他收到的消息。
我的模型以下列方式工作的方式:每条消息都与一个线程相关,这将用于跟踪彼此相关的回复消息。
我的功能是捕获消息ID并过滤与消息线程相关的所有消息。然后我将使用当前消息ID填充表单,并允许用户回复表单。
当用户通过POST提交时,我将检索隐藏的消息ID并使用检索到的消息ID线程创建新消息。
问题:当超出字符限制并使用引发的错误填充当前消息ID时,我无法弄清楚如何针对这种情况引发错误。有人可以帮助我吗?
class Person(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=30, blank=True)
def __unicode__(self):
return self.user.username
class Thread(models.Model):
subject = models.CharField(max_length=100, blank=True)
user = models.ForeignKey(User)
class Message(models.Model):
user = models.ForeignKey(User, related_name='sender')
recipient = models.ForeignKey(User, related_name='recipient')
created = models.DateTimeField(auto_now_add=True)
body = models.CharField(max_length=1000)
read = models.BooleanField(default=False)
sentmessage = models.BooleanField(default=False)
thread = models.ForeignKey(Thread)
draft = models.BooleanField(default=False)
def __unicode__(self):
return self.body
查看:
@login_required
def read(request,id):
try:
messages = Message.objects.get(pk=id,recipient=request.user)
except Message.DoesNotExist:
return HttpResponseRedirect(reverse('world:Display'))
messages.read = True
messages.save()
if request.method =='POST':
form = ReplyForm(request.POST)
if form.is_valid():
id = request.POST.get('hidden_field', False)
try:
messages = Message.objects.get(pk=id ,recipient=request.user,sentmessage=True,draft=False)
except Message.DoesNotExist or Thread.DOesNotExist:
return HttpResponseRedirect(reverse('world:LoginRequest'))
person = Person.objects.get(user=messages.user)
if person.inbox == "D":
return HttpResponseRedirect(reverse('world:message'))
body = form.cleaned_data['body']
Message.objects.create(user=request.user,recipient=messages.user,body=body,thread=messages.thread,sentmessage=True,read=False)
return HttpResponseRedirect(reverse('world:message'))
message = Message.objects.filter(thread=messages.thread ).filter(created__lte=messages.created)
person = Person.objects.get(user=request.user)
initial = {}
initial.update({'hidden_field': messages.id})
form = ReplyForm(initial=initial)
return render(request,'read.html',{'messages':messages,'form':form,'message':message,'person':person})
形式
class ReplyForm(forms.Form):
body = forms.CharField(widget=forms.Textarea,required=False,max_length=555)
hidden_field = forms.CharField(widget=forms.HiddenInput())
模板:
<div class="box22">
{% for m in message %}
<div class="wrapper">
<div class="user">{{m.user.username}} </div>
<div class="message">{{m.body}}</div>
</div>
{% endfor %}
<form method="POST" >{% csrf_token %}
{{form.body}}{{form.hidden_field}}
<input type = "submit" value= "send" class="sen"/>
</form>
{{form.body.errors}}
答案 0 :(得分:2)
首先,我建议您仅使用form.cleaned_data
来获取提交的数据。
id = form.cleaned_data['hidden_field']
另外,当您在函数args中定义了id
时,为什么要从request.POST数据中重新分配id
?也许它看起来像:
msg_response_id = form.cleaned_data['hidden_field']
然后,您始终需要检查hidden_field
值,您可以使用自定义清理方法执行此操作。将clean_hidden_field
方法添加到表单中,您还应覆盖 init 表单方法并传递id
和msg_response_id
。
在您的观点中:
form = ReplyForm(initial=initial, id=id, msg_response_id=msg_response_id)
表格:
class ReplyForm(forms.Form):
def __init__(self, *args, **kwargs):
self.id = kwargs.pop('id', None)
self.msg_response_id = kwargs.pop('msg_response_id', None)
super(ReplyForm, self).__init__(*args, **kwargs)
hidden_field = forms.CharField(widget=forms.HiddenInput())
def clean_hidden_field(self):
if self.id and self.msg_response_id and self.id == self.msg_response_id:
# Raise form error, which will appear in your template.
raise forms.ValidationError(_('You can't reply to your own message.'))
答案 1 :(得分:1)
描述你想要的内容的最后一段并不是很清楚,但我相信你要做的是,当你的表格中没有达到某个要求时,加注是例外。
如果是这种情况,那么只需捕获内置于django的ValidationError
即可。
所以,像这样:
try:
form = ReplyForm(request.POST)
except ValidationError:
# do what you want here
可替换地,
form = ReplyForm(request.POST)
if form.is_valid():
# do stuff
else:
raise ValidationError
如果这对您不起作用,那么您可以尝试在不使用django-forms的情况下验证后期数据,但通常django会为您解决此问题,并且它会自动生成错误消息。您可以深入了解@ form validation here。
但是,如果您想要更精细的颗粒控制,您可以自己制作表格,并在视图中处理验证。否则,ValidationError
应该执行此操作,并允许您重定向错误消息。