Как использовать пакет Django-hitcount для построения счетчика просмотров - PullRequest
0 голосов
/ 19 сентября 2019

Я изучаю Django и наткнулся на этот пакет Django под названием «Django-hitcount».Но я не знаю, как использовать это в моем счете.Я хочу отобразить количество просмотров объекта

Ниже приведены мои views.py

def home(request):
    songs = Songs.objects.all()
    return render(request, 'explore/home.html', {'songs': songs})
    count_hit = True

Это мои models.py

class Songs(models.Model, HitCountMixin):
    ...
    plays = GenericRelation(HitCount, object_id_field='object_pk', related_query_name='hit_count_generic_relation')
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)

    class Meta:
        ordering = ['-updated']

    def __str__(self):
        return self.song_title

Имой HTML-файл ...

    <p><strong><h5>{{ song.song_title }}</h5></strong></p>
    <p><h5>{{ song.artist }}</h5></p>
    <span>plays: {% get_hit_count for [song] %}</span>

1 Ответ

0 голосов
/ 19 сентября 2019

Вы смешиваете различные способы подсчета попаданий и отображения количества попаданий.

Прежде всего, чтобы подсчитать количество попаданий для одного объекта, вам нужно добавить DetailView, которое показываетодна песняВ этот класс также добавляется параметр count_hit Что-то вроде этого (views.py):

from hitcount.views import HitCountDetailView

class SongDetailView(HitCountDetailView):
    model = Song        
    count_hit = True    
    template = 'song_detail.html'

    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        context = self.get_context_data(object=self.object)
        return redirect(self.object.song.audio_file.url)

HitCountDetailView - это встроенное представление HitCount, которое получает один объект и суммирует HitCounts.

Добавьте шаблон для отображения одной песни (song_detail.html):

<p><strong><h5>{{ object.song_title }}</h5></strong></p>
<p><h5>{{ object.artist }}</h5></p>
<span>plays: {% get_hit_count for [object] %}</span>

Затем в свои URL добавьте следующий шаблон (urls.py):

urlpatterns = [
    ...
    path('song/<int:id>/', SongDetailView.as_view(), name='song-detail'),
    ...
]

Теперь у вас есть два URL-адреса, один из которых ведет к дому, а другой - к песне /, первый должен отображать список песен, второй - только одну песню.

В некотором ненужном / неправильном кодеВаш исходный код, который я объясню ниже:

Ваш models.py имеет общее отношение к HitCount, которое не является необходимым, если вы не хотите делать прямой поиск в этих моделях HitCount, но сейчас,Вы можете оставить это

HitCountMixin следует добавить к представлению, в частности к представлению на основе классов, но не к модели.Ваш файл models.py должен выглядеть следующим образом:

class Songs(models.Model):
    ...
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)

    class Meta:
        ordering = ['-updated']

    def __str__(self):
        return self.song_title

Ваш шаблон выглядит как часть файла, но если это не так, он неверен.Лучше было бы перебрать каждую песню (вы также можете связать ее с новым подробным видом), например:

{% for song in songs %}
    <p><strong><h5>{{ song.song_title }}</h5></strong></p>
    <p><h5>{{ song.artist }}</h5></p>
    <span>plays: {% get_hit_count for [song] %}</span>
    <a href="{% url 'song-detail' song.id %}">Play song</a>
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...