【问题标题】:NOT NULL constraint failed: forum_question.user_id (django)NOT NULL 约束失败:forum_question.user_id (django)
【发布时间】:2022-08-09 02:10:26
【问题描述】:

我正在尝试使用 cbv 保存一个对象,我刚开始使用它,我正在尝试使用创建视图保存一个对象,但出现此错误:

\"NOT NULL 约束失败:forum_question.user_id\"

我将感谢初学者对如何解决此问题的友好解释以及提示,谢谢!

模型.py:

class Question(VoteModel, models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=30)
    detail = models.TextField()
    tags = models.TextField(default=\'\')
    add_time = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

表格.py:

class QuestionForm(ModelForm):
    class Meta:
        model = Question
        fields = [\'title\', \'detail\', \'tags\']

视图.py:

class AskForm(CreateView):
    def post(self):
        user = self.request.user
        model = Question
        form_class = QuestionForm
        template_name = \'forum/ask-question.html\'
        if form_class.is_valid():
            form_class.save()

例外?:

编辑3:

额外信息:

回溯(最近一次通话最后): 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/core/handlers/exception.py\",第 47 行,在内部 响应 = get_response(请求) 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/core/handlers/base.py\",第 181 行,在 _get_response 响应 = Wrapped_callback(request, *callback_args, **callback_kwargs) 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/views/generic/base.py\",第 69 行,在视图中 return self.dispatch(request, *args, **kwargs) 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/views/generic/base.py\",第 101 行,在调度中 返回处理程序(请求,*args,**kwargs) 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/views/generic/edit.py\",第 174 行,在帖子中 return super().post(request, *args, **kwargs) 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/views/generic/edit.py\",第 144 行,在帖子中 返回 self.form_valid(form) 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/views/generic/edit.py\",第 127 行,在 form_valid self.object = form.save() 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/forms/models.py\",第 466 行,保存 self.instance.save() 文件 \"/home/titanium/.local/lib/python3.8/site-packages/vote/models.py\",第 67 行,保存 super(VoteModel, self).save(*args, **kwargs) 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/db/models/base.py\",第 743 行,保存 self.save_base(使用=使用,force_insert=force_insert, 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/db/models/base.py\",第 780 行,在 save_base 更新 = self._save_table( 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/db/models/base.py\",第 885 行,在 _save_table 结果 = self._do_insert(cls._base_manager,使用,字段,returning_fields,原始) 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/db/models/base.py\",第 923 行,在 _do_insert 返回经理._插入( 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/db/models/manager.py\",第 85 行,在 manager_method 中 返回 getattr(self.get_queryset(), name)(*args, **kwargs) 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/db/models/query.py\",第 1301 行,在 _insert return query.get_compiler(using=using).execute_sql(returning_fields) 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/db/models/sql/compiler.py\",第 1441 行,在 execute_sql cursor.execute(sql,参数) 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/db/backends/utils.py\",第 99 行,在执行 返回 super().execute(sql, 参数) 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/db/backends/utils.py\",第 67 行,在执行 return self._execute_with_wrappers(sql, params, many=False, executor=self._execute) 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/db/backends/utils.py\",第 76 行,在 _execute_with_wrappers 返回执行程序(sql,参数,许多,上下文) 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/db/backends/utils.py\",第 85 行,在 _execute 返回 self.cursor.execute(sql, params) 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/db/utils.py\",第 90 行,在出口从 exc_value 提高 dj_exc_value.with_traceback(traceback) 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/db/backends/utils.py\",第 85 行,在 _execute 返回 self.cursor.execute(sql, params) 文件 \"/home/titanium/.local/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py\",第 416 行,在执行 返回 Database.Cursor.execute(self, query, params) django.db.utils.IntegrityError:NOT NULL 约束失败:forum_question.user_id [2022 年 4 月 14 日 09:58:02] \"POST /ask/ HTTP/1.1\" 500 175023

  • 当您使用Question 模型创建QuestionForm 时,您需要添加User,因为您将其设为ForeignKey 关系并且您没有将其指定为NULL(必需),默认情况下它是必需的(NOT NULL )。

标签: python django


【解决方案1】:

论坛问题实例必须具有非空用户字段,但您没有指定与您正在创建的对象相关的用户。如果您不想添加用户,请将模型的用户字段更新为:

user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, null=True)

或者在您的询问表单中,您重载 form_valid() 以添加类似这样的用户(注意我没有直接对此进行测试,请遵循documentation here):

   class AskForm(CreateView):
       def post(self):
           user = self.request.user
           model = Question
           form_class = QuestionForm
           template_name = 'forum/ask-question.html'
           if form_class.is_valid():
               form_class.save()

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

【讨论】:

  • 它没有用,出现同样的错误:(
  • 您能否提供完整的异常或指向导致异常的行,这将有助于理解如何解决问题。
  • 你好,你是这个意思吗?
  • 上述异常(NOT NULL 约束失败:forum_question.user_id)是以下异常的直接原因:
  • response = await sync_to_async(response_for_exception, thread_sensitive=False)(request, exc) return response return inner else: @wraps(get_response) def inner(request): try: response = get_response(request) ... 例外为 exc: response = response_for_exception (request, exc) 返回响应返回内部
【解决方案2】:

我不确定这是否仍然有用,但是,我遇到了同样的错误。您可以通过删除迁移文件和数据库来修复错误。 该错误是由于将 NULL 数据(无数据)发送到数据库中已经存在的字段,通常是在该字段被修改或删除之后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-01
    • 2020-03-28
    • 2020-12-19
    • 2016-04-02
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多