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=
的第一行看起来缩进得太远)我返回到/。数据库中没有错误消息,也没有任何内容。因此,该块在发布时执行。但不保存。@user673600MyFromID
是外键,但不允许为空。这就解释了为什么不进行保存(不过它会抛出一个错误)。添加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')
将其转换为整数)。