#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. Да, если вы собираетесь разделить комментарий и оценку на две разные модели.