4

模型:

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>

尝试仅发布以下 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()

无法更改会话,因为数据未验证。

表单返回的错误是

状态 - 此字段是必需的

我需要更新的字段不固定,我想避免每次都发布所有字段。我必须为每种情况制作不同的表格吗?

4

1 回答 1

4

编辑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'] as strings 永远不会是 False,甚至是空字符串。例如,在 IDLE 中试试这个:

>>> '' == True
>>> '' == False

>>> 'a' == True
>>> 'a' == False

您会注意到这始终评估为 False。

因此,您所看到的从未真正创建参考模型。

于 2012-04-18T14:36:49.560 回答