【问题标题】:Hit Count/Page View Functionality Django App点击计数/页面查看功能 Django 应用程序
【发布时间】:2020-04-30 11:11:33
【问题描述】:

这个问题已经被问过了,大多数人建议使用 django-hitcount。 https://pypi.org/project/django-hitcount/

我尝试了那个解决方案。但该解决方案适用于 python 2。不是python 3使用。尝试该解决方案时,我遇到了这篇文章中描述的错误: 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()

我有一个基于类的视图类 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

我怎样才能做到这一点? 谢谢, 钢铁侠

【问题讨论】:

  • 您试图在 ActionItem 类而不是模型实例上调用您的方法......并且在错误的位置。您应该覆盖视图中的方法,获取模型实例并调用该实例上的方法
  • @Chris 使用我的实现会是什么样子...
  • DetailView 中,您可能会在get() method 中执行此操作,就在渲染模板之前。

标签: python django django-class-based-views hitcounter


【解决方案1】:

在您的 AuctionItemDetailView 中

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

【讨论】:

  • 我会先调用super().get(),以免重复查询数据库的self.get_object()调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多