Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 实例获胜的模型';t保存到数据库,但在Django中没有错误消息_Python_Django_Forms - Fatal编程技术网

Python 实例获胜的模型';t保存到数据库,但在Django中没有错误消息

Python 实例获胜的模型';t保存到数据库,但在Django中没有错误消息,python,django,forms,Python,Django,Forms,我在用实例保存表单时遇到问题。我有一个带有外键的模型,但我想保存它,但表中并没有显示任何内容,也并没有显示任何错误消息 模型是: class AboutMe(models.Model): MyGender = models.CharField(max_length=50, choices = GENDER_CHOICES) class Message(models.Model): MySubject = models.CharFi

我在用实例保存表单时遇到问题。我有一个带有外键的模型,但我想保存它,但表中并没有显示任何内容,也并没有显示任何错误消息

模型是:

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,})

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

以下是更正的版本,以及一些附加检查:

  • 您应该始终确保您有一个有效的会话。如果您有
    request.session[“AboutMe\u id”]
    且会话已过期,您将收到
    keyrerror
    (因为密钥将不在会话中)。使用字典的
    get
    方法将抑制此错误。相反,如果键不存在,该方法将返回
    None
    。如果会话已过期,我们不应该继续前进-因此我们重定向到根目录

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

  • 最后,如果表单无效,您应该始终有一个条件;所以我也加了那张支票

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

    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}) 
    

    也许我的django知识已经过时了,但是在POST if块中使用
    instance=Sender
    看起来不太正确。另外,你问题上的缩进是否与你的实际情况相符?(带有
    messageForm=
    的第一行看起来缩进得太远)我返回到/。数据库中没有错误消息,也没有任何内容。因此,该块在发布时执行。但不保存。@user673600
    MyFromID
    是外键,但不允许为空。这就解释了为什么不进行保存(不过它会抛出一个错误)。添加
    models.ForeignKey(AboutMe,null=True,blank=True)
    并再次创建该表(删除它并
    syncdb
    it)。我添加了这一行MyFromID=models.ForeignKey(AboutMe,null=True,blank=True)并重新生成。但是仍然有同样的问题。@user673600这真是奇怪。您确定它正在传递
    消息表单。是否有效()
    ?谢谢!我会看看这个,然后用它。我的印象是,通过使用实例,我永远不需要显式地声明message.MyFromId=sender联系人表单在使用前已按预期呈现良好。你所说的“表格实例错误”是什么意思?再次感谢。该表单是针对
    ModelForm
    model的,但您向其传递了一个关于
    AboutMe
    model的实例。我想这就是处理FK安排的方式。我最初尝试的是formset,即formset=BookInlineFormSet(request.POST,request.FILES,instance=author),所以实例应该总是引用同一个对象。是的。处理FK的方法是抓取对象的一个实例(使用
    commit=False
    ),然后手动分配密钥。您也不需要
    save_m2m()
    ,因为您没有任何
    manytomy
    关系;而
    int(1)
    1
    相同,因为
    1
    是一个整数(
    '1'
    是一个字符串,然后需要
    int('1')
    将其转换为整数)。