0

我正在构建一个简单的消息传递应用程序,用户可以在其中相互发送消息。我正在开发一项功能,该功能允许用户发送他们以前保存为草稿的消息。

问题是,当没有提交输入或用户名不存在时,它不会引发任何错误。我认为有些东西阻止了它,这意味着它不会创建要发送给其他用户的消息

这是我的模型

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)
    trash = models.BooleanField(default=False)
    sentmessage = models.BooleanField(default=False)
    thread = models.ForeignKey(Thread,blank=True,null=True)

    def __unicode__(self):
        return self.body

因为您需要主题、收件人和正文来发送消息,并且它们都处于不同的模型中,此时用户已经创建了消息并将其保存为草稿。我创建了 2 个表单,每个表单都有不同的模型,并用它们的对象填充每个表单。

class DraftForm(forms.ModelForm):
    recipient = forms.CharField(required=True,max_length=2)
    body = forms.CharField(widget=forms.Textarea,required=True,max_length=1)
    hidden_field = forms.CharField(widget=forms.HiddenInput())       

    class Meta:
        model = Message 
        fields = ('body',)  

    def clean_recipient(self):
            recipient = self.cleaned_data['recipient']

            try:
                recipient = User.objects.get(username=recipient)
            except User.DoesNotExist:
                raise forms.ValidationError("This username does not exist")
            return recipient
class ThreadForm(forms.ModelForm):
    class Meta:
        model = Thread 
        fields = ('subject',)    

意见

@login_required
def ReadDraft(request,id):
    try:
        messages = Message.objects.get(pk=id,recipient=request.user,trash=True) 
    except Message.DoesNotExist:
        return HttpResponseRedirect(reverse('world:Display'))
    thread = Thread.objects.get(message=messages)
    initial = {}
    initial.update({'hidden_field': messages.id})
    draft = DraftForm(instance=messages,initial=initial)
    thread = ThreadForm(instance=thread)
    person = Person.objects.get(user=request.user)

    if request.method =='POST':
        id = request.POST.get('hidden_field', False)
        form = ThreadForm(request.POST)
        forms = DraftForm(request.POST)
        if form.is_valid and forms.is_valid():
            m = Message.objects.get(pk=id)
            recipient = form.cleaned_data['recipient']
            subject = form.cleaned_data['subject']
            body = form.cleaned_data['body']
            message =    Message.objects.create(user=request.user,recipient=recipient,body=message,thread=m.thread)

    return render(request,'create.html',{'DraftForm':draft,'ThreadForm':thread,'person':person})

形式

{% if DraftForm and ThreadForm %}

<form method="POST" >{% csrf_token %}

    {{DraftForm.recipient}}
    {{ThreadForm.subject}}
    {{DraftForm.body}}
    {{DraftForm.hidden_field}}
    <input type = "submit" value= "send" class="save" id="send"  />


</form>

{% endif %}

{{ThreadForm.subject.errors}}
{{DraftForm.recipient.errors}}
{{DraftForm.body.errors}}
4

2 回答 2

2

当您执行 POST 请求并且验证失败时,您不会在模板上下文中包含您的表单。因此,您的表单没有错误消息。

您应该执行以下操作:

if request.method =='POST':
    # some more code here ...
    thread = ThreadForm(request.POST)
    draft = DraftForm(request.POST)

希望这可以帮助。

编辑:还看看 Burhans 的回答,你忘记了大括号if forms.is_valid()

于 2013-07-04T11:37:36.367 回答
1

它不起作用,因为这里:

if form.is_valid and forms.is_valid()

一个是属性,一个是方法调用,其中只有一个实际上在做任何事情(另一个是返回True)。

即使有任何错误,您也没有条件检查表单是否失败并返回模板(没有else用于检查的子句if)。

把所有这些放在一起,你应该有这样的东西:

if request.method =='POST':
   id = request.POST.get('hidden_field')  # get will return None as default value
   form = ThreadForm(request.POST)
   forms = DraftForm(request.POST)
   if form.is_valid() and forms.is_valid():
      # do stuff
      return redirect(reverse('some-url'))
   else:
      ctx = {'DraftForm': form, 'ThreadForm': forms}
      return render(request, 'forms.html', ctx)
else:
   return redirect(reverse('some-url'))

在 中forms.html,您应该有:

{{ DraftForm.errors }}
{{ ThreadForm.errors }}    
于 2013-07-04T11:41:38.227 回答