具有实例的模型将不会保存到DB但在Django中没有错误消息

时间:2013-09-24 15:37:07

标签: python django forms

我在使用实例保存表单时遇到问题。我有一个带外键的模型,但我想保存它 - 但表中没有出现任何错误信息。

模型是:

class AboutMe(models.Model):
    MyGender                   = models.CharField(max_length=50, choices = GENDER_CHOICES)


class Message(models.Model):
    MySubject     =  models.CharField(max_length=100)
    MyMessage     =  models.CharField(max_length=100)
    MyFromID      =  models.ForeignKey(AboutMe)

class ContactForm(ModelForm):
    class Meta:
        model = Message
        exclude = ('MyRead', 'MyDeleted', 'MySpam', 'MyDate', 'MyTime', 'MyFromID', 'MyToID')
    MyMessage = forms.CharField(widget=forms.Textarea)

def Contact(request):
        myid = request.session["AboutMe_id"]

        Sender = AboutMe.objects.get(pk=myid)
        if request.method == "POST":
            message = ContactForm(request.POST, instance=Sender)
            if message.is_valid():
                message.save(commit=False)
                #return HttpResponse(myid)
                message.MyRead = False
                message.MyDeleted = False
                message.MySpam = False
                message.MyDate = datetime.date.today()
                message.MyTime = timezone.now()
                message.MyToID = int(1)
                message.save()
                message.save_m2m()
                return redirect('/')
        else:
            message = ContactForm(request.POST, instance=Sender)
        return render(request, "contact.html", {'form': message,})

我也试过这个:

def Contact(request):
    myid = request.session["AboutMe_id"]

    Sender = AboutMe.objects.get(pk=myid)
    if request.method == "POST":
        messageForm = ContactForm(request.POST, instance=Sender)    
        if messageForm.is_valid():
            message = messageForm.save(commit=False)
            #message.save(commit=False)
            #return HttpResponse(myid)
            message.MyRead = False
            message.MyDeleted = False
            message.MySpam = False
            message.MyDate = datetime.date.today()
            message.MyTime = timezone.now()
            message.MyToID = int(1)
            message.save()
            #message.save_m2m()
            return redirect('/')
    else:
        messageForm = ContactForm( instance=Sender)
    return render(request, "contact.html", {'form': messageForm,})

1 个答案:

答案 0 :(得分:2)

您将错误的实例传递给表单,因为表单适用于Message模型,而不是AboutMe模型。

以下是更正后的版本以及一些其他检查:

  1. 您应该始终确保您拥有有效的会话。如果您有request.session["AboutMe_id"]且会话已过期,您将获得KeyError(因为密钥不在会话中)。使用get字典方法将抑制此错误。相反,如果密钥不存在,该方法将返回None。如果会话已过期,我们不应该继续前进 - 所以我们会重定向到根目录。

  2. 即使会话有效 - 它也可能不包含模型的有效值。在这种情况下,此AboutMe.objects.get(pk=myid)将引发异常。为了防止这种情况,我们将其包装在try / except块中。如果对象不存在,则表示会话中的值无效。我们删除密钥,然后将用户重定向到根目录。

  3. 最后,如果表单无效,您应该始终有条件;所以我也加了检查。

  4. 其余的更改主要是格式化。方法名称应以小写字母开头,正常名称也应如此。只有类名应该在InitialCaps中。

    def contact(request):
        myid = request.session.get("AboutMe_id")
        if not myid:
            # session has expired
            return redirect('/')
        try:
            sender = AboutMe.objects.get(pk=myid)
        except AbouMe.DoesNotExist:
            # Invalid id in session
            del request.session['AboutMe_id']
            return redirect('/')
    
        messageForm = ContactForm(request.POST or {})
        if request.method == "POST":      
            if messageForm.is_valid():
                message = messageForm.save(commit=False)
                message.MyRead = False
                message.MyDeleted = False
                message.MySpam = False
                message.MyDate = datetime.date.today()
                message.MyTime = timezone.now()
                message.MyToID = 1
                message.MyFromID = sender
                message.save()
                return redirect('/')
            else:
                # form is not valid
                return render(request, "contact.html", {'form': messageForm})
         else:
             # return empty form
             return render(request, 'contact.html', {'form': messageForm})