Реализация просмотров страниц в Django - PullRequest
0 голосов
/ 30 апреля 2020

Я работаю над небольшим небольшим веб-сайтом и хочу отобразить общее количество просмотров каждого объекта в подробном представлении. Но, искренне, я не знаю, как это реализовать. Позвольте мне опубликовать мои models.py и views.py

Models.py

class Music(models.Model):
    artist = models.CharField(max_length=300)
    title = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(default='', blank=True, unique=True)
    thumbnail = models.ImageField(blank=False)
    audio_file = models.FileField(default='')
    uploaded_date = models.DateTimeField(default=timezone.now)

    class Meta:
        ordering = ['-uploaded_date']

    def save(self):
        self.uploaded_date = timezone.now()
        self.slug = slugify(self.title)
        super(Music, self).save()

    def __str__(self):
        return self.title + ' by ' + self.artist

    def get_absolute_url(self):
        return reverse('music:detail', kwargs={'slug': self.slug})

Views.py

        return Music.objects.order_by('-uploaded_date')


def detail(request, slug):
    latest_posts = Music.objects.order_by('-uploaded_date')[:5]
    song = get_object_or_404(Music, slug=slug)
    comments = Comment.objects.filter(post=song)

    if request.method == 'POST':
        comment_form = CommentForm(request.POST or None)
        if comment_form.is_valid():
            comment = comment_form.save(commit=False)
            comment.post = song
            comment.save()
            return HttpResponseRedirect(song.get_absolute_url())
    else:
        comment_form = CommentForm()

    context = {
        'latest_posts': latest_posts,
        'song': song,
        'comments': comments,
        'comment_form': comment_form,
    }
    return render(request, 'music/detail.html', context)

1 Ответ

0 голосов
/ 30 апреля 2020

Вы можете добавить IntegerField к вашей Music модели с именем page_views:

class Music(models.Model):
    ...
    page_views = IntegerField(default=0)

Затем, заимствуя у этот ответ , вы можете увеличить views для отдельного человека. song из вашего detail представления всякий раз, когда запрашивается страница:

def detail(request, slug):
    latest_posts = Music.objects.order_by('-uploaded_date')[:5]
    song = get_object_or_404(Music, slug=slug)
    comments = Comment.objects.filter(post=song)

    if request.method == 'POST':
        comment_form = CommentForm(request.POST or None)
        if comment_form.is_valid():
            comment = comment_form.save(commit=False)
            comment.post = song
            comment.save()
            return HttpResponseRedirect(song.get_absolute_url())
    else:
        comment_form = CommentForm()
        song.update(page_views=F('page_views') + 1) # Add this line here so it's not updated on POST

    context = {
        'latest_posts': latest_posts,
        'song': song,
        'comments': comments,
        'comment_form': comment_form,
    }
    return render(request, 'music/detail.html', context)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...