1

我的网站有一个评论部分,用户可以在其中对产品发表评论。产品页面上的评论将存储在名为“ProductReview”的模型中。这是模型的代码:

    class ProductReview(models.Model):
        product = models.ForeignKey(Product, related_name='reviews', on_delete=models.CASCADE)
        name = models.CharField(blank=True,max_length=20)
        stars = models.IntegerField()
        content = models.TextField(blank=True)
        date_added = models.DateTimeField(auto_now_add=True)
        created_by = models.OneToOneField(User, on_delete=models.CASCADE)

现在与模型关联的视图如下注意:整个视图与错误无关。与保存注释相关的部分是第二个“request.POST”,我使用 # 用 python 注释表示

def product(request, category_slug, product_slug):
    cart = Cart(request)
    product = get_object_or_404(Product, category__slug=category_slug, slug=product_slug)

    if request.method == 'POST':
        form = AddToCartForm(request.POST)

        if form.is_valid():
            quantity = form.cleaned_data['quantity']
            cart.add(product_id=product.id, quantity=quantity, update_quantity=False)
            messages.success(request, 'The product was added to the cart')
            return redirect('product', category_slug=category_slug, product_slug=product_slug)

    similar_products = list(product.category.products.exclude(id=product.id))

    # this part is for saving of the user comments to productreview model
    if request.method == 'POST':
        stars = request.POST.get('stars', 3)
        content = request.POST.get('content', '')
        name = request.POST.get('name', '')
        created_by = request.user

        review = ProductReview.objects.create(product=product, name=name, stars=stars, content=content, created_by=created_by)
        return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
    # this marks the end of the code relevant to saving the user comment 

    if len(similar_products) >= 4:
        similar_products = random.sample(similar_products, 4)

    user_type = 0
    if request.user.is_authenticated:
        user_type = UserType.objects.filter(created_by=request.user.id).values_list('user_type', flat=True)
        user_type = int(user_type[0])
    return render(request, 'product.html', {'product': product, 'similar_products': similar_products, 'user_type': user_type})

最后是视图中引用的模板“product.html”的相关部分

{% if request.user.is_authenticated %}
        {% if user_type == 2 %}
            <div class="notification space-below">
                <form method="post" action=".">
                    {% csrf_token %}


                     <div class="field">
                        <label>Name</label>
                        <div class="control">
                            <input class="text" name="name" value="{{ request.user }}" readonly>
                        </div>
                    </div>


                    <div class="field">
                        <label>Stars</label>
                        <div class="control">
                             <div class="select">
                                 <select name="stars">
                                     <option value="1">1</option>
                                     <option value="2">2</option>
                                     <option value="3" selected>3</option>
                                     <option value="4">4</option>
                                     <option value="5">5</option>

                                 </select>
                             </div>
                        </div>
                    </div>

                    <div class="field">
                        <label>Content</label>
                        <div class="control">
                            <textarea class="textarea" name="content"></textarea>
                        </div>
                    </div>

                    <div class="field">
                        <div class="control">
                            <button class="button is-success">Submit</button>
                        </div>
                    </div>

                </form>
            </div>

            {% else %}
                <div>sign in with a buyer account to leave review</div>

            {% endif %}
    {% endif %}

现在,当我尝试在 product.html 页面中填写表单并尝试提交时,我收到以下错误:

FOREIGN KEY constraint failed
IntegrityError at /smartwatch/apple-watch/

谁能告诉我的代码到底有什么问题?

4

1 回答 1

0

很确定这一切都来自您的模型,尤其是这一行:

    created_by = models.OneToOneField(User, on_delete=models.CASCADE)

您正在使用OneToOneField. 这意味着单个用户将能够在您的整个应用程序中留下单个评论。您收到完整性错误可能是因为您选择的此用户已经对不同的产品进行了评论。

如果这不是您想要的,请使用 normalForeignKey代替。

我认为您的意图是确保单个用户对每个产品只能留下一条评论。在这种情况下,您应该尝试在和字段之间设置UniqueConstraintproductcreated_by

于 2021-04-28T12:46:41.350 回答