型号:
class Session(models.Model):
tutor = models.ForeignKey(User)
start_time = models.DateTimeField()
end_time = models.DateTimeField()
status = models.CharField(max_length=1)
形式:
class SessionForm(forms.ModelForm):
class Meta:
model = Session
exclude = ['tutor']
测试:
>>> ses = Session.objects.get(pk=1)
>>> ses
<Session: Robert - 2012-04-18 13:00:00>
>>> form = SessionForm(instance=ses)
现在举例来说,我只想更新此实例的status
并保存
我怎么能这样做?
修改
模板:
<form action="fhjsdhkl" method="POST">{{ csrf_token }}
<input name="start_time" />
<input name="end_time" />
</form>
尝试仅发布这两个字段:
if request.method == 'POST':
form = SessionForm(request.POST)
if request.POST['id']:
try:
s = Session.objects.get(pk=request.POST['id'])
form.instance = s
except Session.DoesNotExist:
pass
if form.is_valid():
form.save()
由于数据未验证,因此无法更改会话。
表单返回的错误是
status - 此字段是必填字段
我需要更新的字段不固定,我希望每次都避免发布所有字段。我是否必须为每个案例制作不同的表格?
答案 0 :(得分:3)
编辑2:旧答案无关紧要
if request.method == 'POST':
form = SessionForm(request.POST)
if request.POST['id']:
try:
s = Session.objects.get(pk=request.POST['id'])
form.instance = s
except Session.DoesNotExist:
pass
if form.is_valid():
form.save()
好的,你有很多事情要做:
1
这一行应该是这样的:
form = SessionForm(request.POST, instance = s)
2
您应该移动会话对象:
if request.method == 'POST':
s = get_object_or_404(Session, pk=request.POST['id'])
form = SessionForm(request.POST, instance = s)
如果您执行下面的try和except方法,则只要该对象不存在,您就会引发验证错误。扔掉404而不是。文档位于以上快捷方式:https://docs.djangoproject.com/en/1.0/topics/http/shortcuts/#get-object-or-404如果您尚未导入,则需要导入。
现在您可以对其进行评估并保存:
if request.method == 'POST':
s = get_object_or_404(Session, pk=request.POST['id'])
form = SessionForm(request.POST, instance = s)
if form.is_valid():
form.save()
3
此外,你不应该这样做:如果request.POST ['id']作为字符串永远不是False,甚至是空字符串。例如,请在IDLE中尝试:
>>> '' == True
>>> '' == False
>>> 'a' == True
>>> 'a' == False
你会注意到这总是评估为False。
所以,你所看到的实际上并没有真正创建参考模型。