0

想象一下,我们正在开发一个消息系统,每个系统Message都有一个用于sender.

我们正在使用ModelForms,并且有一个MessageFormMessage.
当然,我们不希望用户能够sender通过发布不同的发件人 ID来进行欺骗。

sender因此,我们必须从岗位中 排除ModelForm和填补。session

我应该在哪里以及如何将任意数据分配给ModelForm字段?

在我的示例中,我可能想要访问session,所以我们也需要访问request
这是否意味着代码必须在表单创建后立即出现在视图中?

我们如何从代码中分配表单字段并确保它覆盖 POST 数据?

(当然,这个例子是非常虚构的,这里只是为了说明问题。)

4

2 回答 2

1

您可以按原样将其排除,然后在视图中处理表单时执行以下操作:

obj = form.save(commit=False)
obj.sender = request.user
obj.save()

或者,您可以在表单的保存方法中执行此操作;为此,您需要将请求对象暂时保存在表单中。类似于以下内容:

class MyForm(forms.ModelForm):
  def __init__(self, request, *args, **kwargs):
    self._request = request
    super(MyForm, self).__init__(*args, **kwargs)

  def save(self, commit=False):
    obj = super(MyForm, self).save(commit=False)
    obj.sender = self._request.user
    if commit:
      obj.save()

    return obj

我自己更喜欢第二种方式,因为它有助于将有关该模型的逻辑及其数据封装在一个整洁的地方。

于 2011-10-10T16:07:31.150 回答
1

只需从 中排除该sender字段,ModelForm并且当您在 POST 端点上的视图中实例化对象时(就在保存之前),请确保sender使用适当的会话或用户 ID 填充该字段。

当您排除该字段时,无法将该字段添加到帖子数据[1],因此用户无法对其进行欺骗。

[1] 使用 JavaScript,&sender=someSenderId理论上可以添加 a,但在您看来,您不需要查找 sender 字段。它不会被序列化到ModelForm对象中。

于 2011-10-10T15:41:41.890 回答