【发布时间】:2020-04-22 22:06:56
【问题描述】:
我正在为我的网站建立一个评级系统。它目前运行良好,但我想改进系统的美学方面。我希望能够从数据库中获取评级并将其显示为 5 星评级。另外,如果不是太复杂,我希望能够点击星星将评分记录在数据库中,而不是写一个数字。
我对网络开发很陌生。特别是,我没有使用 javascript 的经验(我只做了在互联网上找到的教程),我认为这是实现我正在搜索的功能所必需的,所以请给我一个小例子和你的回复,以便让我能够理解。
为了将评分渲染为星星,我不知道该怎么做。为了将评分记录为星星,我想到了两种解决方案:
1) 使用django star-ratings,但我认为我不具备理解其工作原理所需的能力。我已经发帖寻求有关此应用程序的帮助和示例,但我没有收到任何帮助,所以我想我应该忘记这一点。
2) 使用带有一些适当小部件的表单将 IntegerInput 呈现为 5 星评级。
对于第二种解决方案,我已经有了代码,我现在需要一个小部件来替换下面代码中的'Stars',但我不知道该怎么做。有人能帮我吗 ?
models.py
class Avis(models.Model):
note = models.IntegerField()
forms.py
class AvisForm(forms.ModelForm):
class Meta:
model = Avis
fields = ['note']
widgets = {'note': forms.NumberInput(attrs={'class': 'Stars'})}
labels = {'note': 'Note /5'}
用于录制的hmtl
<form method="post" action="">
{% csrf_token %}
{% for field in form %}
<div class="fieldWrapper form-group">
{{ field.label_tag }}
{{ field }}
</div>
{% endfor %}
<input type="submit" class="btn btn-lg btn-outline-primary btn-block btn-login text-uppercase font-
weight-bold mb-2" value="Envoyer mon avis" />
</form>
hmtl 显示
{{ avis.note }}
提前致谢!
编辑(到目前为止,我的代码用于评级存储): 视图.py
def avis(request, id): # view for displaying and storing the form
commande = get_object_or_404(Commande, id=id)
if request.method == "POST":
form = AvisForm(request.POST)
if form.is_valid():
avis = form.save(commit = False)
avis.commande = commande
avis.save()
commande.has_avis = True
commande.save()
if commande.plat.chef.nb_avis==0:
commande.plat.chef.rating = avis.note
else:
commande.plat.chef.rating = (commande.plat.chef.rating*commande.plat.chef.nb_avis + avis.note)/(commande.plat.chef.nb_avis + 1)
commande.plat.chef.nb_avis += 1
commande.plat.chef.save()
messages.success(request, 'Votre avis a été correctement envoyé !')
return redirect(mes_commandes)
else:
form = AvisForm()
return render(request, 'actualites/avis.html', locals())
def avis2(request, id): # view for recording the rating
avis = get_object_or_404(Avis, id=id)
rating = request.POST.get('rating')
avis.note = rating
avis.save()
messages.success(request, 'Votre avis a été correctement envoyé !')
return redirect(mes_commandes)
html
<form method="post" action="">
{% csrf_token %}
{% for field in form %}
<div class="fieldWrapper form-group">
{{ field.label_tag }}
{{ field }}
</div>
{% endfor %}
<input type="submit" class="btn btn-lg btn-outline-primary btn-block btn-login text-uppercase font-weight-bold mb-2" value="Envoyer mon avis" />
</form>
<div class="rating rating2">
<a href="#5" title="Give 5 stars" data-value="5">★</a>
<a href="#4" title="Give 4 stars" data-value="4">★</a>
<a href="#3" title="Give 3 stars" data-value="3">★</a>
<a href="#2" title="Give 2 stars" data-value="2">★</a>
<a href="#1" title="Give 1 star" data-value="1">★</a>
</div>
<script>
$(".rating a").on('click', function(e){
let value = $(this).data('value');
$.ajax({
url: "{% url 'avis2' %}",
type: 'POST',
data: {'rating': value},
success: function (d){
// some processing
}
})
});
</script>
forms.py
class AvisForm(forms.ModelForm):
class Meta:
model = Avis
fields = ['commentaire']
widgets = {'commentaire': forms.Textarea(attrs={'class': 'form-control'})}
【问题讨论】:
-
pypi 上的
django-star-ratings上的文档有哪些不清楚的地方? -
没有示例,也没有关于如何实际使用该应用程序在模板中记录和显示评分的说明。也许我应该查看代码来理解,我做到了,但我对 Django 的理解还不够好。一位用户在下面给了我一个更简单的方法来做我想做的事,无论如何感谢您的评论
-
你知道如何获取个人用户在django星级评分中的评分吗?
标签: django django-forms django-templates