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

m5s*_*pal 4 django django-models django-generic-views django-class-based-views

我正在尝试使用CreateView跟踪创建对象的用户,我的工作方式与在文档中完成的操作完全相同(https://docs.djangoproject.com/en/dev/topics/class-based-views/ generic-editing /,Models和request.user)除了我不使用login_required()装饰器而是使用来自django-braces的LoginRequiredMixin.

我的模特:

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()
Run Code Online (Sandbox Code Playgroud)

我的看法:

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)
Run Code Online (Sandbox Code Playgroud)

当我尝试创建一个新对象时,我收到一个错误:

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).
Run Code Online (Sandbox Code Playgroud)

为什么会出现此错误?我唯一想做的就是在创建对象时自动添加到对象.

...编辑...

我注意到这个问题与CreateWithInlinesViewdjango extra-views有关.当我改变我的观点以使用django的泛型时,CreateView一切都可以正常运行.所以现在基本上问题是为什么这个解决方案无法使用CreateWithInlinesView

m5s*_*pal 5

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

所以在使用时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)
Run Code Online (Sandbox Code Playgroud)