Функциональность счетчика посещений/просмотра страницы Приложение Django

Вопрос был задан, и большинство из них предлагают использовать django-hitcount. https://pypi.org/project/django-hitcount/

Я попробовал это решение. Но это решение предназначено для использования python 2. Не использовать Python 3. Пробуя это решение, я столкнулся с ошибкой, описанной в этом сообщении: Django Hit Count ImportError

Поэтому я пытаюсь создать эту функциональность. У меня есть модель предмета аукциона. Я сохраняю viewCount среди других полей:

модели.py

from django.db import models
from django.contrib.auth.models import User
from PIL import Image
from django.utils import timezone

class AuctionItem(models.Model):

    seller = models.ForeignKey(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='auction_items')
    title = models.CharField(max_length=100)
    description = models.TextField()

    startBid = models.FloatField()
    buyNowPrice = models.FloatField()
    buyNowEnabled = models.BooleanField()
    deliveryCost = models.FloatField()

    startDate = models.DateTimeField(default=timezone.now)
    endDate =  models.DateTimeField(default=timezone.now)

    viewCount=models.IntegerField(default=0)

    def __str__(self):
        return self.title

    def save(self):
        super().save()

        img = Image.open(self.image.path)

        if img.height > 300 or img.width > 300:
            output_size = (300, 300)
            img.thumbnail(output_size)
            img.save(self.image.path)

    def getCurrentTopBid():
        return startBid

    def incrementViewCount(self):
        self.viewCount += 1
        self.save()

У меня есть основанный на классе класс представления AuctionItemDetailView(DetailView) для подробного представления предмета аукциона, и в нем я пытаюсь увеличить viewCount в модели, вызвав incrementViewCount()

просмотры.py

from django.shortcuts import render, get_object_or_404
from django.contrib.auth.mixins import (
    LoginRequiredMixin, 
    UserPassesTestMixin
)
from django.contrib.auth.models import User
from django.views.generic import (
        ListView, 
        DetailView, 
        CreateView,
        UpdateView,
        DeleteView,

        )

from .models import AuctionItem

class AuctionItemListView(ListView):
    model = AuctionItem               #looks dir of app name   #template  #view
    template_name = 'auctionitem/auctionitem_list.html' #<app>/<model>_<viewtype>.html
    context_object_name = 'auctionitems'
    ordering = ['-startDate']
    paginate_by = 2

class UserAuctionItemListView(ListView):
    model = AuctionItem                #looks dir of app name   #template  #view
    template_name = 'auctionitem/user_auctionitems.html' #<app>/<model>_<viewtype>.html
    context_object_name = 'auctionitems'
    ordering = ['-date_posted']
    paginate_by = 2

    def get_queryset(self):
        user = get_object_or_404(User, username=self.kwargs.get('username'))
        return AuctionItem.objects.filter(seller=user).order_by('-startDate')

class AuctionItemDetailView(DetailView):
    model = AuctionItem
    model.incrementViewCount()

class AuctionItemCreateView(LoginRequiredMixin, CreateView):
    model = AuctionItem
    fields = ['image', 'title', 'description', 'startBid', 'buyNowPrice', 'buyNowEnabled', 'startDate', 'endDate', 'deliveryCost', 'seller']
    success_url ='/'
    def form_valid(self,form):
        form.instance.seller = self.request.user
        return super().form_valid(form)

class AuctionItemUpdateView(LoginRequiredMixin,UpdateView):
    model = AuctionItem
    fields = ['title', 'description', 'startBid', 'buyNowPrice', 'buyNowEnabled', 'startDate', 'deliveryCost', 'seller']


    def form_valid(self,form):
        form.instance.seller = self.request.user
        return super().form_valid(form)

        def test_func(self):
            post = self.get_object()
            if self.request.user == auctionitem.seller:
                return True
            return False

class AuctionItemDeleteView(LoginRequiredMixin,UserPassesTestMixin, DeleteView):
    model = AuctionItem
    success_url ='/'

    def test_func(self):
            post = self.get_object()
            if self.request.user == auctionitem.seller:
                return True
            return False

Но когда я запускаю сервер, я получаю следующую ошибку:

TypeError: incrementViewCount() missing 1 required positional argument: 'self'

Я попытался передать «я» и получил следующую ошибку:

NameError: name 'self' is not defined

Как я могу заставить это работать? Спасибо, Айронмен


person Ironman    schedule 13.01.2020    source источник
comment
Вы пытаетесь вызвать свой метод для класса ActionItem, а не для экземпляра модели... и не в том месте. Вы должны переопределить метод в своем представлении, взять экземпляр модели и вызвать метод для этого экземпляра.   -  person Chris    schedule 13.01.2020
comment
@Chris, как бы это выглядело с моей реализацией...   -  person Ironman    schedule 13.01.2020
comment
В DetailView вы, вероятно, сделали бы это в get() метод непосредственно перед рендерингом шаблона.   -  person dirkgroten    schedule 13.01.2020


Ответы (1)


В вашем AuctionItemDetailView

def get(self, request, *args, **kwargs):
    res = super().get(request, *args, **kwargs)    
    self.object.incrementViewCount()
    return res
person Chris    schedule 13.01.2020
comment
Я бы сначала сделал вызов super().get(), чтобы не дублировать вызов self.get_object(), который запрашивает базу данных. - person dirkgroten; 13.01.2020