提交后项目未存储在数据库中

问题描述 投票:0回答:1

我正在 Django 中构建这个网站,我将位置存储为数据库中的“项目”。用户可以输入每个位置的详细视图,然后按“评分”按钮,该按钮将打开一个表格,让他们输入评分。稍后我想在每个位置显示用户评分的平均值。我将用户对一个名为“Ratings”的数据库中的对象的评级存储起来。但是,当我提交时,项目不会存储在“评级”中。 这是视图文件:

`from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required

from .models import Item
from .forms import RateItemForm

# Create your views here.


def detail(request, pk):
    item = get_object_or_404(Item, pk = pk)

    related_items = Item.objects.filter(category = item.category, is_sold = False).exclude(pk=pk).order_by('-price')[0:3]

    items = Item.objects.filter(is_sold = False).order_by('-price')[0:6]
    highest_rated_item = items.first()

    return render(request, 'item/detail.html', {
        'item': item,
        'related_items' : related_items,
        'highest_rated_item' : highest_rated_item
    })

@login_required(login_url='/login/')
def rate(request, pk):
    item = get_object_or_404(Item, pk = pk)


    if request.method == "POST":

        form = RateItemForm(request.POST)

        if form.is_valid():

            rating = form.save(commit=False)
            rating.user = request.user
            rating.item = item
            rating.save()
            return redirect('item:detail', pk = rating.id)
    
        else:
            print(form.errors)
    else:
        form = RateItemForm()

    return render(request, 'item/rate.html', {
        'item': item,
        'form' : form,
    })`

模型文件

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Category(models.Model):

    name = models.CharField(max_length=255)
    

    class Meta:
        # verbose_name = _("Category")
        verbose_name_plural = "Categories"
        ordering = ('name',)

    def __str__(self):
        return self.name

    # def get_absolute_url(self):
    #     return reverse("Category_detail", kwargs={"pk": self.pk})


class Item(models.Model):
    
    category = models.ForeignKey(Category, related_name = "items", on_delete=models.CASCADE)
    name = models.CharField(max_length=255)
    description = models.TextField(blank = True, null = True)
    price = models.FloatField()
    image = models.ImageField(upload_to = 'item_images', blank = True, null=True)
    is_sold = models.BooleanField(default = False)
    created_by = models.ForeignKey(User, related_name = "items", on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

    # class Meta:
    #     verbose_name = _("Item")
    #     verbose_name_plural = _("Items")

    def __str__(self):
        return self.name

    # def get_absolute_url(self):
    #     return reverse("Item_detail", kwargs={"pk": self.pk})

class Rating(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    location = models.ForeignKey(Item, on_delete=models.CASCADE)
    rating = models.IntegerField() 

    # def __str__(self):
    #     return self.name

表格文件

from django import forms

from .models import Item, Rating

class RateItemForm(forms.ModelForm):
    class Meta:
        model = Rating
        fields = ('rating',)

    rating = forms.IntegerField(widget=forms.TextInput(attrs={
    'placeholder' : 'Your rating',
    'class' : 'w-full py-4 px-6 rounded-xl border'
    }))

还有 urls 文件

from django.urls import path

from . import views

app_name = 'item'

urlpatterns = [
    path('<int:pk>/', views.detail, name='detail'),
    path('<int:pk>rating/', views.rate, name='rate')
]

还有rate.html 文件

{% extends 'main/base.html' %}

{% block title %} Rating {{ item.name }} {% endblock %}

{% block content %}

<div class="grid grid-cols-5 gap-3">

    <div class="col-span-3"> 
        <img src="{{item.image.url}}" class="rounded-xl">
    </div>


    <div class="col-span-2 p-6 bg-gray-100 rounded-xl flex flex-col ">
        <h1 class="text-center text-3xl mb-6">Rating: {{item.name}}</h1>


        <div class="text-justify text-gray-500 overflow-y-auto">
            <form action="." method="POST">
                {% csrf_token %}

                <div class="mb-3">
                    <label class="inline-block mb-2">Your rating</label> <br>
                    {{form.rating}}
                </div>

                {% if form.errors or form.non_field_errors %}
                    <div class="mb-3 p-6 bg-red-100 rounded-xl">
                        {% for field in form %}
                            {{field.errors}}
                        {% endfor %}

                        {{form.non_field_errors}}
                    </div>
                {% endif %}

                
            <button class="mt-6 bg-teal-500 hover:bg-teal-700 rounded-xl text-lg px-6 py-3 text-white">Submit</button>


            </form>
        </div>


    </div>

</div>

{% endblock %}

我希望每个项目都存储在数据库中,以便我稍后可以处理它们。现在我收到此错误:“ 异常值:
NOT NULL 约束失败:item_ rating.location_id" 在我使用主键玩了一下之后,但在此之前它无论如何都不起作用

django django-models django-views django-forms django-templates
1个回答
0
投票

您的

location
字段似乎未呈现,因此它未随表单提交请求一起传递。

您需要在表单中包含位置字段:

class RateItemForm(forms.ModelForm):
    class Meta:
        model = Rating
        fields = ('rating', 'location',)

或在保存

Rating
模型时手动分配位置对象:

rating = form.save(commit=False)
rating.user = request.user
rating.location = item
rating.save()

看起来你很可能犯了一个错误,并且你试图将

item
对象分配给
rating.item
而不是
rating.location
,因此出现错误。

© www.soinside.com 2019 - 2024. All rights reserved.