我在使用实例保存表单时遇到问题。我有一个带外键的模型,但我想保存它 - 但表中没有出现任何错误信息。
模型是:
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,})
答案 0 :(得分:2)
您将错误的实例传递给表单,因为表单适用于Message
模型,而不是AboutMe
模型。
以下是更正后的版本以及一些其他检查:
您应该始终确保您拥有有效的会话。如果您有request.session["AboutMe_id"]
且会话已过期,您将获得KeyError
(因为密钥不在会话中)。使用get
字典方法将抑制此错误。相反,如果密钥不存在,该方法将返回None
。如果会话已过期,我们不应该继续前进 - 所以我们会重定向到根目录。
即使会话有效 - 它也可能不包含模型的有效值。在这种情况下,此AboutMe.objects.get(pk=myid)
将引发异常。为了防止这种情况,我们将其包装在try / except块中。如果对象不存在,则表示会话中的值无效。我们删除密钥,然后将用户重定向到根目录。
最后,如果表单无效,您应该始终有条件;所以我也加了检查。
其余的更改主要是格式化。方法名称应以小写字母开头,正常名称也应如此。只有类名应该在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})