Python 在Django 1.11中实施多部分五星评级系统

Python 在Django 1.11中实施多部分五星评级系统,python,django,rating,Python,Django,Rating,我对堆栈溢出完全陌生,对Django/Python也相当陌生。我没有太多的编码背景(不到一个月前开始学习python),但我想学习它并尝试一下 我对HTML和CSS的了解足以满足我的需求,但Python/Django对我来说仍然是未知领域 到目前为止,我有一个非常基本的网站,我正在尝试实现一个由多个部分组成的五星评级系统,该系统可以自定义并与我的数据库一起工作 这是我的模型: class listing(models.Model): user = models.ForeignKey(settin

我对堆栈溢出完全陌生,对Django/Python也相当陌生。我没有太多的编码背景(不到一个月前开始学习python),但我想学习它并尝试一下

我对HTML和CSS的了解足以满足我的需求,但Python/Django对我来说仍然是未知领域

到目前为止,我有一个非常基本的网站,我正在尝试实现一个由多个部分组成的五星评级系统,该系统可以自定义并与我的数据库一起工作

这是我的模型:

class listing(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
title = models.CharField(max_length = 100, default="Class Title")
slug = models.SlugField(unique=True)
draft = models.BooleanField(default=False)
publish = models.DateField(auto_now=False, auto_now_add=False)
description = models.TextField(default="Class Description")
prerequisite = models.TextField(default="Class Prerequisites")
university = models.CharField(max_length = 100, default="Choose A University")
department = models.CharField(max_length = 100, default="Choose A Department")
last_updated = models.DateTimeField(auto_now=True, auto_now_add=False)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
image = models.FileField(
    upload_to=upload_location,
    null=True, 
    blank=True)


def __str__(self):
    return self.title


def get_absolute_url(self):
    return reverse("listings:detail", kwargs={"slug": self.slug})
基本上,我想让用户能够根据我定义的4个自定义标准对每个类进行评分。例如,难度等级、工作量等级、书本等级、出勤等级

我理想的情况是这样做,用户可以输入他们对五星评级系统的决定,我可以定制,使明星看起来像我想要的样子

理想情况下,在最好的情况下,我希望它看起来像这样

我希望用户的决定被发送到我的数据库,然后作为一个平均值进行计算,然后作为一个整数显示在我的列表详细视图上,我也可以使用CSS进行自定义(对于如何实现这一点也有点困惑)

以下是我的清单详细视图:

def listings_detail(request, slug=None):
instance = get_object_or_404(listing, slug=slug)
share_string = quote(instance.description)
context = {
    "title": "Detail",
    "instance": instance,
    "share_string": share_string,

}
return render(request, "class_page.html", context)
请记住,我仍然是一个初学者!我正在尽我最大的努力去理解Django和Python

实现设计完全可定制的多部件五星级评级系统的最佳方式是什么


谢谢你的时间和帮助

有很多事情要做,所以我不会给你写所有的代码,但我会努力引导你走上正确的道路:

正如你所说的,你可以用css和html开始评分,所以没有问题

要向django发送评级,您需要遵循以下步骤:

1-如果你想知道哪些用户的评分以及他们的评分,你需要一个新的模型和你需要的字段(用户,他们评分的内容,如果有多个要评分,则每个人都有一个字段。如“难度”\u rate和etc+一个字段指向列表或此评分行用于的任何其他内容。您可以使用关系字段来完成此操作

2-在你的模板中,你需要javascript将评级发送给django(你可以不用javascript,但你应该制作一个表单,并按照你想要的方式设计它)

如果您使用的是javascript,那么您应该监听点击,并将用户和评级发送给django。 使用javascript和ajax发送数据,然后在视图上获取数据。 对于用户来说,这是一种更难但更好的方式来提交他们的评分

但是,如果您不想使用javascript或ajax,您可以使用表单。您可以创建一个表单并设计它,然后添加一个提交按钮。之后,所有数据都将像普通表单一样在视图中可用,您可以将数据保存在数据库中,然后按自己的喜好进行计算

您的评级模型如下所示:

class Rate(models.Model):
    listing = models.ForeignKey(listing)
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    dif_rate = models.IntegerField(null=True, blank=True)
    other_rate = models.IntegerField(null=True, blank=True)
    ...
......
if request.method == 'POST':
    # take care of instance
    form = RateForm(request.POST, instance=your-listing-instance)
    if form.is_valid():
        rate = form.save(commit=False)
        # adding the user here.
        rate.user = request.user
        rate.save()
 ......
您的观点将根据您想要的方式有所不同,但如果您使用表单,这是一种简单的方式,它将如下所示:

class Rate(models.Model):
    listing = models.ForeignKey(listing)
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    dif_rate = models.IntegerField(null=True, blank=True)
    other_rate = models.IntegerField(null=True, blank=True)
    ...
......
if request.method == 'POST':
    # take care of instance
    form = RateForm(request.POST, instance=your-listing-instance)
    if form.is_valid():
        rate = form.save(commit=False)
        # adding the user here.
        rate.user = request.user
        rate.save()
 ......
以及您的forms.py:

class RateForm(forms.ModelForm):
    class Meta:
        model = Rate
        fields = ('dif_rate', 'other_rate')

嘿,谢谢你的回复!如果你不介意的话,我只是有一些关于表单处理方式的问题。我已经尝试了这种方法,并且成功地创建了一个表单。当我转到相应表单的html模板时,我可以看到我的难度评分选择等。我可以通过下拉菜单从1到5中进行选择。这就是fine,然后这些信息被发送到数据库,这很好。但是我如何使下拉菜单显示为可由css自定义的星星?这是我不清楚的部分。也许以后如何计算平均值?设计部分我帮不了你多少。我是一个非常糟糕的设计师(:D)这不是我的专长,但我认为你可以使用任何其他输入,让你的生活更容易设计一个明星式的评级系统。比如radio box?然后你必须使用javascript,在你看来,你只需要检查使用了哪个radio box。记住,你不必使用表单来为你做所有的事情。y您可以像这样提取输入:
rate=request.POST.get('your-input-name')
,它为您提供该输入的值,您可以手动保存或进行计算