我正在尝试使用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()
我的观点:
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).
为什么会出现这种错误?我唯一想做的就是在创建对象时自动添加到对象。
...编辑...
我注意到这个问题与django extra-views中的CreateWithInlinesView
有关。当我改变我的观点以使用django的通用CreateView
时,一切都可以正常运行。所以基本上问题是,为什么这个解决方案不适用于CreateWithInlinesView
?
答案 0 :(得分: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)