Django - 更新ModelForm的某些字段

时间:2012-04-18 14:25:55

标签: django django-forms

型号:

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 - 此字段是必填字段

我需要更新的字段不固定,我希望每次都避免发布所有字段。我是否必须为每个案例制作不同的表格?

1 个答案:

答案 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。

所以,你所看到的实际上并没有真正创建参考模型。