【问题标题】:Setting model user to request.user with CreateView in Django returns "null value in column "author_id" error在 Django 中使用 CreateView 将模型用户设置为 request.user 返回“列“author_id”错误中的空值
【发布时间】:2019-08-28 14:00:49
【问题描述】:

我有一个在 ModelForm 上运行的 CreateView,它是模型 Item 的子类。 Item.author = ForeignKey(User,on_delete=models.CASCADE,)

在 CreateView 中,用户填写了大部分表单,但我希望将 Item.author 设置为 request.user。每当我这样做时,使用 form_valid() 设置 form.instance.author = self.request.user,我得到一个错误,说“列“author_id”中的空值违反非空约束”

我尝试从 form.py 中删除“作者”作为要编辑的字段。

这就是我想要复制的内容: https://docs.djangoproject.com/en/2.1/topics/class-based-views/generic-editing/#models-and-request-user

模型.py


    class Item(models.Model):


    # SOME OTHER FIELDS WHICH RENDER AND SAVE FINE

    author = models.ForeignKey(User,
                                on_delete=models.CASCADE,

            def get_absolute_url(self):
               return reverse('item_detail',args=[str(self.id)])
                               )

forms.py

    class SubmitItemForm(forms.ModelForm):

    class Meta():
        model = Item
        fields = ('link','title','excerpt','type','author')


    def __init__(self, *args, **kwargs):
        super(SubmitItemForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper(self)
        self.helper.form_id = 'submit_item'
        self.helper.form_class = 'submit'
        self.helper.form_method = 'post'
        self.helper.form_action = 'item_detail'

        self.helper.add_input(Submit('submit', 'Submit'))

views.py

    class SubmitItem(LoginRequiredMixin, generic.CreateView):
    login_url = '/login/'
    redirect_field_name = 'item_detail.html'
    form_class = SubmitItemForm
    model = Item

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

    def form_invalid(self, form):
        response = super().form_invalid(form)
        return response

我希望表单保存到数据库,并使用 Item 模型中描述的 get_absolute_url() 方法将浏览器重定向到保存的数据。

【问题讨论】:

    标签: python django forms model


    【解决方案1】:

    您可以更改您的form_valid 方法,如下所示

        def form_valid(self, form):
            form.instance.author_id = self.request.user.pk
            return super().form_valid(form)
    
    

    【讨论】:

    • 嗨 - 感谢您的回复。我刚试过这个,但我仍然得到“列“author_id”中的空值违反非空约束”
    • 放一个打印语句,看看有没有值
    【解决方案2】:

    对于任何遇到同样问题的人 - 这是我如何让它工作的。 我没有在上面的代码中 (!!!) 我在模型上有一个 def clean(self) 方法。

    '''蟒蛇 def 清洁(自我): all_clean_data = super().clean() self.save()

    我删除了这一行(因为我相信这是来自之前的迭代,form_valid() 负责验证(?)并应用了 Anjaneyulu 的上述修复,现在模型可以正确保存。

    【讨论】:

      猜你喜欢
      • 2013-06-20
      • 2018-05-09
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      相关资源
      最近更新 更多