因此,我目前正在为我的学校项目建立一个在线store .在网上store ,用户应该能够提交对每种产品的 comments .不过,我在提交 comments 时遇到了一些问题.它给了我这个错误:

NOT NULL constraint failed:

我已经被困在这个问题上大约15个小时了,我似乎解决不了它.如果能得到所有的帮助,我将不胜感激.

回溯:


Traceback (most recent call last):
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 423, in execute
    return Database.Cursor.execute(self, query, params)

The above exception (NOT NULL constraint failed: products_reviewrating.user_id) was the direct cause of the following exception:
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/workspace/webster00/products/views.py", line 91, in submit_review
    newreview.save()
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/db/models/base.py", line 726, in save
    self.save_base(using=using, force_insert=force_insert,
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/db/models/base.py", line 763, in save_base
    updated = self._save_table(
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/db/models/base.py", line 868, in _save_table
    results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/db/models/base.py", line 906, in _do_insert
    return manager._insert(
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/db/models/query.py", line 1270, in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1410, in execute_sql
    cursor.execute(sql, params)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/db/backends/utils.py", line 98, in execute
    return super().execute(sql, params)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/db/backends/utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 423, in execute
    return Database.Cursor.execute(self, query, params)

Exception Type: IntegrityError at /products/submit_review/6/
Exception Value: NOT NULL constraint failed: products_reviewrating.user_id

Views.py

def submit_review(request, product_id):
    print(f'product_id: {product_id}')
    url = request.META.get('HTTP_REFERER')
    if request.method == 'POST':
        try:
            product = Product.objects.get(id=product_id)
            reviews = ReviewRating.objects.filter(user=request.user.userprofile, product=product).first()
            form = ReviewForm(request.POST, instance=reviews)
            newreview = form.save(commit=False)
            newreview.product = product
            newreview.save()
            form.save()

            messages.success(request, 'Thank you! Your review has been updated')
            return redirect(url)
        except ReviewRating.DoesNotExist:
            form = ReviewForm(request.POST)
            if form.is_valid():
                data = ReviewRating()
                data.subject = form.cleaned_data['subject']
                data.rating = form.cleaned_data['rating']
                data.review = form.cleaned_data['review']
                data.ip = request.META.get('REMOTE_ADDR')
                data.product_id = product_id
                data.user_id = request.user.id
                data.save()
                messages.success(request, 'Thank you! Your review has been submited.')
                return redirect(url)

comments 也没有在Django管理员中显示.

推荐答案

您可能可以通过以下方式大大简化视图:

from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404


@login_required
def submit_review(request, product_id):
    product = get_object_or_404(Product, pk=product_id)
    userprofile = request.user.userprofile
    review = ReviewRating.objects.filter(
        user=userprofile, product=product
    ).first()
    if request.method == 'POST':
        action = ('submitted', 'updated')[review is not None]
        form = ReviewForm(request.POST, request.FILES, instance=review)
        if form.is_valid():
            form.instance.product_id = product_id
            form.instance.user = userprofile
            form.instance.ip = request.META.get('REMOTE_ADDR')
            form.save()
            messages.success(
                request, f'Thank you! Your review has been {action}.'
            )
            return redirect(URL)
    else:
        form = ReviewForm(request.POST, request.FILES, instance=review)
    return render(request, 'name-of-some-template.html', {'form': form})

Note:可以将视图限制为只允许经过身份验证的用户查看 @login_required decorator [Django-doc].


Note:使用get_object_or_404(…) [Django-doc]通常更好, 然后直接使用.get(…) [Django-doc].在对象不存在的情况下, 例如,因为用户自己更改了URL,所以get_object_or_404(…)将返回HTTP 404 Not Found响应,而使用 .get(…)的结果是HTTP 500 Server Error.

Python相关问答推荐

如何最好地处理严重级联的json

Numpy索引argsorted使用integer数组,同时保留排序顺序

如何在vercel中指定Python运行时版本?

使用regex分析具有特定字符的字符串(如果它们存在)

如何修复使用turtle和tkinter制作的绘画应用程序的撤销功能

不允许AMBIMA API请求方法

计算相同形状的两个张量的SSE损失

当多个值具有相同模式时返回空

Python中的嵌套Ruby哈希

为什么符号没有按顺序添加?

优化pytorch函数以消除for循环

如何在类和classy-fastapi -fastapi- followup中使用FastAPI创建路由

如何将多进程池声明为变量并将其导入到另一个Python文件

在vscode上使用Python虚拟环境时((env))

如何设置视频语言时上传到YouTube与Python API客户端

NumPy中条件嵌套for循环的向量化

如何在Polars中从列表中的所有 struct 中 Select 字段?

计算分布的标准差

如何在FastAPI中为我上传的json文件提供索引ID?

Python全局变量递归得到不同的结果