列 "owner_id"中/new null 值处的 Django IntegrityError 违反了非空约束

标签 django django-models django-class-based-views django-generic-views

我正在尝试使用 CreateView 跟踪创建对象的用户,并且我的操作与文档( https://docs.djangoproject.com/en/dev/topics/class-based-views/generic-editing/ ,模型和 request.user)中所做的完全一样,只是我不使用 login_required() 装饰器而是 LoginRequiredMixin从 django-braces 代替。

我的型号:

class Contact(models.Model):
    owner = models.ForeignKey(User, editable=False)
    first_name = models.CharField(max_length=255,)
    last_name = models.CharField(max_length=255,)
    email = models.EmailField()

我的看法:
class CreateContactView(LoginRequiredMixin, ContactOwnerMixin, CreateWithInlinesView):
    model = models.Contact
    template_name = 'contacts/edit_contact.html'
    form_class = forms.ContactForm
    inlines = [forms.ContactAddressFormSet]

    def form_valid(self, form):
        form.instance.owner = self.request.user
        return super(CreateContactView, self).form_valid(form)

当我尝试创建一个新对象时,出现错误:
IntegrityError at /new
null value in column "owner_id" violates not-null constraint
DETAIL:  Failing row contains (3, null, John, Smith, john.smith@gmail.com).

为什么会发生这个错误?我唯一想做的是在创建对象时将所有者自动添加到对象中。

...编辑...

我注意到这个问题与CreateWithInlinesView有关。从 django 额外的意见。当我更改 View 以使用 django 的通用 CreateView相反,一切正常。所以现在基本上问题是为什么这个解决方案不适用于 CreateWithInlinesView ?

最佳答案

我设法解决了这个问题。我只是犯了一个愚蠢的错误,但我提供了这个答案,以防万一其他人犯了愚蠢的错误。

所以当使用 CreateWithInlinesView您必须覆盖功能 forms_valid()而不是 form_valid()使一切正常工作。您的 forms_valid()应该是这样的:

def forms_valid(self, form, inlines):
    form.instance.owner = self.request.user
    return super(CreateContactView, self).forms_valid(form, inlines)

关于列 "owner_id"中/new null 值处的 Django IntegrityError 违反了非空约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22155302/

相关文章:

python - 将 curl 命令转换为 request.post

python - 找不到参数 'wagtailadmin_explore' ',)' 的 '(' 反向

python - 对象没有属性 'prepare'

python - 无法使用 MEDIA_ROOT 和 MEDIA_URL 在 Django 中上传图片

python - 在 Django DetailView 旁边显示对象列表

django - 在 Django 中过滤 prefetch_related

函数的 Python unittest.mock.patch 不起作用

python - 覆盖 Django 中的保存导致无限递归错误

python - 最初在 Django-Form 中填充 FileField

python - “initial”是此函数的无效关键字参数