点击 Count/Page 查看功能 Django 应用程序

Hit Count/Page View Functionality Django App

问题已经问过了,大部分建议使用django-hitcount。 https://pypi.org/project/django-hitcount/

我试过那个解决方案。但该解决方案是供 python 2 使用的。不python3使用。尝试该解决方案后,我 运行 遇到了 post 中描述的错误: Django Hit Count ImportError

所以我正在尝试创建此功能。我有一个拍卖品模型。我在其他字段中坚持使用 viewCount:

models.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()

我有一个基于 class 的视图 class AuctionItemDetailView(DetailView) 用于拍卖项目详细信息视图,在其中我试图通过调用 incrementViewCount()[来增加模型中的 viewCount

views.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'

我尝试通过 'self',但出现以下错误:

NameError: name 'self' is not defined

我怎样才能完成这项工作? 谢谢, 钢铁侠

在您的 AuctionItemDetailView 中

def get(self, request, *args, **kwargs):
    res = super().get(request, *args, **kwargs)    
    self.object.incrementViewCount()
    return res