【问题标题】:Django IntegrityError at /new null value in column "owner_id" violates not-null constraintDjango IntegrityError at /new null value in column "owner_id" 违反非空约束
【发布时间】:2014-04-05 00:07:28
【问题描述】:

我正在尝试跟踪使用 CreateView 创建对象的用户,并且我所做的与文档中所做的完全一样(https://docs.djangoproject.com/en/dev/topics/class-based-views/generic-editing/、Models 和 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).

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

...编辑...

我注意到这个问题与来自 d​​jango extra-views 的 CreateWithInlinesView 有关。当我改变我的观点以使用 django 的通用 CreateView 时,一切都没有问题。所以基本上现在的问题是,为什么这个解决方案不适用于CreateWithInlinesView

【问题讨论】:

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


    【解决方案1】:

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

    因此,当使用 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)
    

    【讨论】:

      猜你喜欢
      • 2021-01-21
      • 2016-10-21
      • 1970-01-01
      • 2019-04-08
      • 2017-10-15
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多