如何在CreateView中设置ForeignKey?

Vla*_* T. 41 python django django-class-based-views

我有一个模特:

class Article(models.Model):
    text = models.CharField()
    author = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)

如何编写基于类的视图来创建新模型实例并将author外键设置为request.user

更新:

解决方案转到下面单独的答案.

Vla*_* T. 37

我通过重写form_valid方法解决了这个问题.这里有详细的风格来澄清事情:

class CreateArticle(CreateView):
    model = Article

    def form_valid(self, form):
        article = form.save(commit=False)
        article.author = self.request.user
        #article.save()  # This is redundant, see comments.
        return super(CreateArticle, self).form_valid(form)
Run Code Online (Sandbox Code Playgroud)

然而,我们可以缩短它(感谢dowjones123),这个案例在文档中提到.

class CreateArticle(CreateView):
    model = Article

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super(CreateArticle, self).form_valid(form)
Run Code Online (Sandbox Code Playgroud)

  • 这并不理想,因为它会导致表单的"save"方法被调用两次.这是其中一种情况,你最好的选择是重新实现`super`方法的其余部分,而不是委托.换句话说,将`self.object`设置为新实例,然后重定向到`self.get_success_url()`. (4认同)
  • 一种稍微更有效的方法(观点可能不同)是用`form.instance.author = self.request.user替换`form_valid`的前两行. (2认同)

Car*_*gas 11

我只是偶然发现了这个问题,这个线程让我朝着正确的方向前进(谢谢!).基于这个Django文档页面,我们可以避免调用表单的save()方法:

class CreateArticle(LoginRequiredMixin, CreateView):
    model = Article

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super(CreateArticle, self).form_valid(form)
Run Code Online (Sandbox Code Playgroud)