如何在 Django 数据库中保存用户评分?

Posted

技术标签:

【中文标题】如何在 Django 数据库中保存用户评分?【英文标题】:How do I save user ratings in Django database? 【发布时间】:2019-09-27 16:23:21 【问题描述】:

这是我在 Django 中的第一个项目。我正在尝试将评分保存在 Django 数据库中,但是当我单击单选按钮时,该值不会存储在数据库中。我已经尝试过以前上传的 Stack Overflow 的解决方案,但没有一个能帮助我解决我的问题。我最初在 forms.py 中使用 Radioselect 但仍然遇到同样的问题。

代码如下:

Model.py

class Product(models.Model):
    title = models.CharField(max_length=120)
    brand = models.CharField(max_length=120,default="None")
    model = models.CharField(max_length=120,default="None")
    slug = models.SlugField(blank=True, unique=True)
    category = models.CharField(max_length=120 , default="Phone")
    price = models.DecimalField(decimal_places=2, max_digits=20, default=39.99)

class Rating(models.Model):
    product=models.ForeignKey(Product,default=None, on_delete=models.PROTECT)
    user=models.ForeignKey(User,default=None, on_delete=models.PROTECT)
    rating = models.CharField(max_length=120)

Views.py

def add_rating(request,id):
    product = get_object_or_404(Product, pk=id)
    pro = Product.objects.get(id=id)
    if request.method == "POST":
        form = RatingForm(request.POST)
        if form.is_valid():
            product = form.cleaned_data['product']
            user = form.cleaned_data['user']
            rating = form.cleaned_data['rating']

            product = request.POST.get('product', ''),
            user = request.POST.get('user', ''),
            rating = request.POST.get('rating', ''),

            obj = Rating(product=product, user=user, rating=rating)
            obj.save()
            context = 'obj': obj
            return render(request, 'product/detail.html',context)
        else:
           form=RatingForm()
        return HttpResponse('Please rate the product')

Forms.py

from django import forms
from .models import Rating

class RatingForm(forms.ModelForm):

   class Meta:
      model = Rating
      fields = ('product', 'user','rating')

template.py

<form method="POST" action="% url 'add_rating' product.id %">%    csrf_token %
<ul class="rate-area" style="display:inline;position:absolute">
<input type="radio" id="5-star" name="rating" value="5" /><label for="5-   star" title="Amazing">5 stars</label>
<input type="radio" id="4-star" name="rating" value="4" /><label for="4-star" title="Good">4 stars</label>
<input type="radio" id="3-star" name="rating" value="3" /><label for="3-star" title="Average">3 stars</label>
<input type="radio" id="2-star" name="rating" value="2" /><label for="2-star" title="Not Good">2 stars</label>
<input type="radio" id="1-star" name="rating" value="1" /><label for="1-star" title="Bad">1 star</label>
<button type="submit" value="Rate">Rate</button>

</ul>

</form>

【问题讨论】:

【参考方案1】:

您在模型上使用“CharField”,而您应该使用“ChoiceField”,ChoiceField 将成为下拉选择。

使用通用编辑视图也会更容易; https://docs.djangoproject.com/en/2.2/ref/class-based-views/generic-editing/

【讨论】:

非常感谢@Kevin D。我已将 CharField 修改为 ChoiceField,但值未存储在数据库中。 如何生成表单?您是使用 form 生成表单还是手动循环遍历所有字段?看起来我在这里遗漏了一些项目。 我没有使用 form 。我想通过遍历字段来做到这一点 这就解释了为什么,开始使用 form 来生成表单并执行测试。如果一切正常,您可以手动呈现表单,它确实需要一些工作,请检查以下docs.djangoproject.com/en/2.2/topics/forms/… 非常感谢@Kevin 的宝贵时间。问题解决了。我没有在 forms.py 中使用 widget forms.RadioSelect 进行评分。

以上是关于如何在 Django 数据库中保存用户评分?的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个请求中使用 django 信号将数据保存在(用户和配置文件)表中?

如何在用户导航期间在 Django 中保存自定义用户模型

如何在 Django 的 CreateView 提交操作中保存当前登录的用户名?

注销后如何保存购物车数据的会话,以便用户在 Django 中再次登录时可以找到它们?

如何使用带有 Django 模板标签的 amp CSS 星级评分?

Django如何在保存到数据库之前连接表格数据