为什么Django的ModelForm验证认为这是无效的?

2 投票
1 回答
984 浏览
提问于 2025-04-15 19:36

我有一个看起来很简单的设置,包括模型、模型表单和一个视图在一起工作。唯一的问题是,这个模型有一个用户属性,这个属性不能通过表单提交,而是应该由 request.user 来填充,所以我这样做了:

# models.py
class Update(models.Model):
    user         = models.ForeignKey(User, related_name="updates")
    organisation = models.ForeignKey(Organisation, related_name="updates")
    publish      = models.BooleanField(default=True)



class UpdateForm(ModelForm):
    name = forms.CharField(
        max_length=140,
        required=False,
        widget=forms.TextInput(attrs={"class": "blankable"})
    )

    class Meta(NodeForm.Meta):
        model = Update



# views.py
def status(request):

    from myproject.organisations.models import Organisation
    from myproject.feeds.models         import Update, UpdateForm

    stream = 0
    if request.method == "POST":

        o = request.POST.get("organisation")

        if not o or request.user not in Organisation.objects.get(pk=request.POST.get("organisation")).administrators.all():
            return HttpResponseRedirect(reverse("ethico.core.views.index"))

        f = UpdateForm(request.POST, instance=Update(user=request.user))

        if f.is_valid():
            stream = f.save()
        else:
            stream = f.errors
    ...

每次我运行这个,我总是会遇到同样的错误:

user: This field is required.

我尝试过用 initial 属性来设置 f,使用 {"user": 1},但它还是说这个字段是必填的。我还尝试过通过复制 request.POST 到一个新变量中,然后修改这个变量再传给 UpdateForm,但这样做太麻烦了。我到底忘记了什么呢?

1 个回答

1

你可以试着在表单中排除用户字段

class UpdateForm(ModelForm):
  name = forms.CharField(
    max_length=140,
    required=False,
    widget=forms.TextInput(attrs={"class": "blankable"})
  )

  class Meta:
    model = Update
    exclude = ("user",)

http://docs.djangoproject.com/en/1.1/topics/forms/modelforms/#s-using-a-subset-of-fields-on-the-form

撰写回答