我正在 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" 在我使用主键玩了一下之后,但在此之前它无论如何都不起作用
您的
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
,因此出现错误。