【问题标题】:Integrity Error when trying to save form, "field may not be NULL"尝试保存表单时出现完整性错误,“字段可能不是 NULL”
【发布时间】:2014-06-04 06:53:40
【问题描述】:

我在我的一个基于班级的视图中进行了此操作:

if form.is_valid():
            form.save(commit=False)
            form.manager = User.objects.get(username=request.user.username)
            form.save()
            location = Location.objects.get(name=form.cleaned_data['name'])
            user.get_profile().owned_locations.add(location)
            return redirect(reverse('location_manager'))

然而,当我填写表格时,我收到以下错误:

IntegrityError at /dash/location/add
locationmanager_location.manager_id may not be NULL

这很奇怪,因为我的 Location 模型如下所示:

class Location(models.Model):
    region = models.ForeignKey(Region)
    manager = models.ForeignKey(User)
    name = models.CharField(max_length=255)
    street_address = models.TextField(blank=True)
    city = models.CharField(max_length=255, blank=True)
    zip_code = models.CharField(max_length=20, blank=True)

我的 Forms.py 看起来像这样:

class locationForm(forms.ModelForm):
    class Meta:
        model = Location
        fields = (
            'region',
            'name',
            'street_address',
            'city',
            'zip_code',

        )
        exclude =('manager',)

我似乎无法弄清楚这里的问题是什么。如果你好奇我为什么要排除,我听从了 Daniel Roseman here 的一些建议

【问题讨论】:

  • 你能在这里粘贴完整的堆栈跟踪吗?

标签: python django django-models django-forms django-views


【解决方案1】:

而不是:

    form.save(commit=False)
    form.manager = User.objects.get(username=request.user.username)
    form.save()

尝试:

    obj = form.save(commit=False)
    obj.manager = User.objects.get(username=request.user.username)
    obj.save()

希望这些有帮助!

【讨论】:

  • 谢谢!这绝对有效。不过我很好奇,为什么要创建一个实例,form.save() 与 obj.save() 有何不同?我有点困惑为什么这是有效的,而之前的代码却没有。
  • @ApathyBear,您可以在 here 找到此行为的详细信息。
【解决方案2】:

你的表单处理有点不正确,你应该这样做:

if form.is_valid():
            instance = form.save(commit=False)
            instance.manager = User.objects.get(username=request.user.username)
            instance.save()
            location = Location.objects.get(name=form.cleaned_data['name'])
            user.get_profile().owned_locations.add(location)
            return redirect(reverse('location_manager'))

【讨论】:

  • 谢谢!你的回答也是正确的。不过我很好奇,为什么要创建一个实例,form.save() 与 obj.save() 有何不同?我有点困惑为什么这是有效的,而之前的代码却没有
  • form.save() 从表单值填充实例。如果 commit 是 True form.save() 发出 instance.save() 并返回实例。如果 commit 为 False form.save 不发出 instance.save() 而是返回(部分)填充的实例,您可以进一步修改并自己发出 instance.save()。
猜你喜欢
  • 2017-11-13
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 2017-08-07
相关资源
最近更新 更多