Django - 更新 ModelForm 的某些字段

Pie*_*NAY 4 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)
Run Code Online (Sandbox Code Playgroud)

形式:

class SessionForm(forms.ModelForm):
  class Meta:
    model = Session
    exclude = ['tutor']
Run Code Online (Sandbox Code Playgroud)

测试:

>>> ses = Session.objects.get(pk=1)
>>> ses
<Session: Robert - 2012-04-18 13:00:00>
>>> form = SessionForm(instance=ses)
Run Code Online (Sandbox Code Playgroud)

例如,现在我只想更新status此实例的并保存它。
我怎样才能做到这一点 ?


编辑

模板:

<form action="fhjsdhkl" method="POST">{{ csrf_token }}
  <input name="start_time" />
  <input name="end_time" />
</form>
Run Code Online (Sandbox Code Playgroud)

尝试仅发布这两个字段:

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()
Run Code Online (Sandbox Code Playgroud)

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

表单返回的错误是

状态 - 此字段为必填项

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

Jam*_*s R 5

编辑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()
Run Code Online (Sandbox Code Playgroud)

好吧,这里发生了很多事情:

1.

这行应该是这样的:

form = SessionForm(request.POST, instance = s)
Run Code Online (Sandbox Code Playgroud)

2.

您应该向上移动会话对象:

if request.method == 'POST':
    s = get_object_or_404(Session, pk=request.POST['id'])
    form = SessionForm(request.POST, instance = s)
Run Code Online (Sandbox Code Playgroud)

如果执行下面的 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()
Run Code Online (Sandbox Code Playgroud)

3.

此外,您不应该这样做:如果 request.POST['id'] 作为字符串永远不会为 False,即使是空字符串。例如,在 IDLE 中尝试以下操作:

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

>>> 'a' == True
>>> 'a' == False
Run Code Online (Sandbox Code Playgroud)

您会注意到它的计算结果始终为 False。

因此,您所看到的实际上从未创建参考模型。