Search code examples
djangopython-3.xdetailviewpageviews

Use sessions to count pageviews django detailview


I am trying to count the visits to a view. I would like for the counter to increment by 1 every time someone calls up the view. Then, I want the "visits" field on the model to automatically update with the latest count. However, I am not sure how to implement this. Using some code I've found, I am trying this:

models.py

class Statute(models.Model):
    address = models.ForeignKey(Address,
                                null = True)
    statute_name = models.CharField(max_length=25,
                                    default='')
    category = models.CharField(max_length=55,
                                default='')
    section_number = models.CharField(max_length=55,
                                    default='')
    section_title = models.CharField(max_length=255,
                                        default='')
    timestamp = models.DateTimeField(editable=False)
    visits = models.IntegerField(default=0)
    content = models.TextField(default='')

    slug = models.SlugField()

views.py

def get_context_data(self, **kwargs):
        context = super(LibraryInStateView, self).get_context_data(**kwargs)
        state = State.objects.get(slug=self.kwargs.get('state'))
        statute = Statute.objects.all()
        context['latest_statutes'] = statute.filter(
                address__zipcode__city__county__state=state).order_by(
                '-timestamp')
        context['statute_count'] = Statute.objects.filter(
                address__zipcode__city__county__state=state).count()    
        context['view_count'] = self.request.session['visits']+1
        return context

Solution

  • You can include it in .get_object() method in LibraryInStateView

    def get_object(self):
        statute = super().get_object()
        statute.visits += 1
        statute.save()
    
        self.view_count = statute.visits
        return statute
    

    Or get method:

    def get(self, request, *args, **kwargs):
        statute = # ... code to retrieve Statute for this view
        statute.visits += 1
        statute.save()
    
        self.view_count = statute.visits
        return super().get(request, *args, **kwargs)
    

    Then once you attached view_count to class instance, you can add it to context:

        def get_context_data(self, **kwargs):
            ...
            context['view_count'] = self.view_count
            return context