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

时间:2017-08-23 14:14:42

标签: python django rating

我是Stack Overflow的新手,对Django / Python来说还不错。我没有太多的编码背景(不到一个月前开始学习python),但我想学习它并尝试一下。

我知道HTML和CSS足以得到我想要的东西,但Python / Django,对我来说仍然是未知领域。

到目前为止,我有一个非常基本的网站,我正在尝试实施一个可自定义并可与我的数据库一起使用的多部分5星评级系统。

所以这是我的模特:

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个自定义标准对每个单独的类进行评级。例如,难度管理,工作量调整,预订,出勤等。

我希望在用户可以在5星级评级系统上输入他们的决定时做到这一点,我可以自定义使星星看起来我希望他们看起来。

理想情况下,在最佳情况下,我希望它看起来像https://codepen.io/anon/pen/JyZGqd

我希望用户决定发送到我的数据库,然后按平均值计算,然后在我的listing_detail视图中显示为一个整数,我也可以使用CSS自定义(稍微一点)对如何做到这一点感到困惑。)

这是我的listing_detail视图:

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。

实现可在设计中完全自定义的多部分五星评级系统的最佳方式是什么?

感谢您的时间和帮助!

1 个答案:

答案 0 :(得分:1)

有很多事要做,我不会给你写所有的代码,但我会尽力以正确的方式引导你:

正如你所说,你可以用css和html开始评级,所以没问题。

要将评分发送到django,您需要按照以下步骤操作:

1 - 如果您想要评估哪些用户的数据及其评级,您需要一个新模型,其中包含您需要的字段(用户,他们评价的内容以及是否有多个用户评分,然后是每个字段他们。像difficulty_rate和etc +一个字段指向列表或此评级行所用的任何其他内容。您可以使用关系字段来完成此操作。

Examples of model relationship API usage | Django documentation

2 - 在你的模板中你需要javascript将评级发送到django(你可以在没有javascript的情况下完成它但你应该制作一个表单并按照你想要的方式设计它)

如果您使用的是javascript,那么您应该听取点击并将用户和评级发送到django。这样你需要Django REST框架来帮助你。 您使用javascript和ajax发送数据,然后获取您的视图数据。 这是更难的方式,但却是用户提交评级的更好方式。

Django REST framework

但如果您不想使用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()
 ......

和你的forms.py:

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