Как мне реализовать пятизвездочный рейтинг в Django DetailView?

#python #django #django-forms #django-class-based-views

#python #django #django-forms #django-class-based-views

Вопрос:

В настоящее время я работаю над сайтом отзывов о ресторанах, и мне трудно отобразить форму комментария с рейтингом в пять звезд на странице подробного просмотра на основе классов.

Как мне реализовать пятизвездочную систему оценки для моей страницы RestarurantDetail на основе классов? Я хотел бы изменить внешний вид моего целочисленного поля «rate» на пятизвездочное поле рейтинга. Я все равно хотел бы отображать все остальные поля в форме комментариев как обычно, возможно, с помощью хрустящих форм (но, возможно, это невозможно, если я хочу настроить поле оценки?)

Если вам нужна дополнительная информация, просто дайте мне знать!

Код

Модель ресторана (ее части) в Models.py

 class Restaurant(models.Model): 
name        = models.CharField(max_length = 100)
country     = models.CharField(max_length = 75)
city        = models.CharField(max_length = 75)
address     = models.CharField(max_length = 100)
categori    = models.ManyToManyField(Kategori)
description = models.CharField(max_length = 300, blank=True)
approved    = models.BooleanField(default=False) 
geom        = PointField(null=True)
owner       = models.ForeignKey(User, on_delete=models.CASCADE)


def __str__(self):
    return self.name

class Meta:
    unique_together = ('country', 'city', 'adress')
  

Модель комментариев в Models.py

 class Comment(models.Model):

ALTERNATIVES_1 = (
    ('Alt 1', 'Alt 1'),
    ('Alt 2', 'Alt 2'),
    ('Alt 3', 'Alt 3'),
)

restaurant       = models.ForeignKey(Restaurant, on_delete = models.CASCADE, related_name='comments')
user             = models.ForeignKey(User, on_delete = models.CASCADE)
title            = models.CharField(max_length = 50, blank = True)
comment          = models.TextField(max_length = 500, blank = True)
rate             = models.IntegerField(default=1)
approved_comment = models.BooleanField(default=False)
likes            = models.IntegerField(default=0)
status_1         = models.CharField(max_length = 100, choices=ALTERNATIVES_1, default='Alt 1')
time_of_visit    = models.DateField(default = datetime.date.today) 
created_at       = models.DateTimeField(auto_now_add=True)
updated_at       = models.DateTimeField(auto_now=True)

def __str__(self):
    return '{}-{}'.format(self.restaurant.name, str(self.user))

def approve(self):
    self.approved_comment = True
    self.save()
  

Форма комментария в forms.py

 class CommentForm(forms.ModelForm):
class Meta:
    model = Comment
    fields = ('title', 'comment', 'rate', 'status_1', 'time_of_visit')
    widgets = {
        'time_of_visit': DatePickerInput(),
        'rate': forms.Textarea(attrs={'class': 'form-control'})
    }
  

Подробное представление ресторана в views.py (моя главная проблема)

 class RestaurantDetailView(DetailView):
model = Restaurant
template_name = 'core/restaurant_detail.html'

def get_context_data(self, **kwargs):
    context = super(RestaurantDetailView, self).get_context_data(**kwargs)
    #context['comments'] = self.object.comments.filter(approved_comment=True)
    context['form'] = CommentForm()
    return context

def point_dataset(self, request):
    points = serialize('geojson', Restaurant.objects.all())
    return HttpResponse(points, content_type='json')

def get_queryset(self):
    return Restaurant.objects.annotate(avg_rating=Avg('comments__rate'))
  

Комментарии:

1. Если речь идет о серверной части, вы можете добавить пять дополнительных целых полей для подсчета звезд (star_1, start_2 и т.д.) Вместо поля rate или просто создать новую модель Rate с одним целочисленным полем stars и внешним ключом к модели ресторана. Если речь идет о интерфейсе, добавьте пять звезд вручную. Каждая звезда — это кнопка, которая отправляет соответствующий рейтинг.

2. Спасибо, Кросби! Я пробую подход с новой моделью ставок с внешним ключом к модели ресторана, это решило бы все проблемы с интерфейсом. Мне также понадобится внешний ключ для модели комментариев, если я хочу отобразить каждый рейтинг вместе с его комментарием?

3. Да, если вы собираетесь разделить комментарий и оценку на две разные модели.