【问题标题】:Implement a multi-part 5 star rating system in Django 1.11在 Django 1.11 中实现多部分 5 星评级系统
【发布时间】:2017-08-23 14:14:41
【问题描述】:

我对 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 个自定义标准对每个单独的课程进行评分。例如,difficult_rating、workload_rating、book_rating、出席率。

理想情况下,我希望用户可以在 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。

实现设计上完全可定制的多部分 5 星评级系统的最佳方法是什么?

感谢您的宝贵时间和帮助!

【问题讨论】:

    标签: python django rating


    【解决方案1】:

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

    正如您所说,您可以使用 css 和 html 进行诸如 start rating 之类的操作,所以那里没有问题。

    要将评分发送到 django,您需要执行以下步骤:

    1 - 如果您想要哪些用户评分的数据以及他们的评分,您需要一个新模型,其中包含您需要的字段(用户,他们评分的内容,如果有多个要评分,那么每个字段都有一个字段其中。例如,difficult_rate 等 + 指向列表的字段或此评分行所针对的任何其他内容。您可以使用关系字段来做到这一点。

    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')
    

    【讨论】:

    • 您好,谢谢您的回复!如果你不介意的话,我只是对形式的做事方式有几个问题。我已经尝试过这种方法,并且我已经成功创建了一个表单。当我转到相应表单的 html 模板时,我可以看到我对难度等级等的选择。我可以从 1 到 5 中进行选择,比如说使用下拉菜单。这很好,然后该信息被发送到数据库,这很棒。但是如何使该下拉菜单显示为可由 css 自定义的星星?这是我不清楚的部分。还有可能之后如何计算平均值?
    • 设计部分我帮不了你太多。我是一个非常糟糕的设计师(:D),这不是我的专业知识,但我认为您可以使用任何其他输入来让您的生活更轻松地设计一个类似星级的评级系统。像收音机盒子?那么您必须使用 javascript 一段时间,在您看来,您只需要检查使用了哪个单选框。记住;你不必使用表单来为你做所有的事情。您可以像这样提取输入:rate = request.POST.get('your-input-name') 它为您提供该输入的值,您可以手动保存它们或进行计算
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多