【问题标题】:How to track ListView, other views and urls via Mixins in Django App如何通过 Django App 中的 Mixins 跟踪 ListView、其他视图和 url
【发布时间】:2019-04-18 19:44:43
【问题描述】:

朋友们,

我有一个 Django 应用程序,我想为我的所有视图添加一些基本跟踪。 (很像柜台或类似的东西)

到目前为止,我可以使用 mixins 跟踪特定对象。因此,每次有人单击我的模型实例(DetailView)时,都会将一个条目添加到我的数据库中。我通过 django 内容类型做到了这一点。

现在,为此我需要一个 get 方法来实际获取特定对象。

但在我的 ListView 中我没有那个对象。

我怎样才能为 url 或我的 ListView 实现类似的东西?这甚至可能吗?我想记录一个条目,说明我的模型列表已被访问。

这是我目前所拥有的:

我的观点

class ListJobView(ObjectViewMixin, ListView):
    model = Job
    context_object_name = 'jobs'
    template_name = 'list_jobs.html'
    ordering = '-pub_date'
    # paginate_by = 1

class DetailJobView(ObjectViewMixin, DetailView):
    model = Job
    template_name = 'detail_job.html'
    queryset = Job.objects.all()

    def get_object(self):
        id = self.kwargs.get("id")
        return get_object_or_404(Job, id=id)

我的混音

from .signals import object_viewed_signal

class ObjectViewMixin:
    def dispatch(self, request, *args, **kwargs):
        try:
            instance = self.get_object()
        except self.model.DoesNotExist:
            instance = None

        if instance is not None:
            object_viewed_signal.send(instance.__class__, instance=instance, request=request)


        return super(ObjectViewMixin, self).dispatch(request, *args, **kwargs)

我的信号

from django.dispatch import Signal

object_viewed_signal = Signal(providing_args=['instance', 'request'])

这是信号处理程序:


    def object_viewed_receiver(sender, instance, request, *args, **kwargs):
        new_viewed_object = ObjectViewed.objects.create(
            user         = request.user,
            content_type = ContentType.objects.get_for_model(sender),
            object_id   = instance.id,
        )

    object_viewed_signal.connect(object_viewed_receiver)

如果我应该提供更多代码,请告诉我。

非常感谢任何帮助...

【问题讨论】:

  • 我建议您发布信号处理程序并澄清您是要为列表返回的每个实例保存一个条目,还是要记录一个条目,说明某些模型的列表具有被访问
  • 好主意,谢谢。我添加了信号处理程序和说明。再次在这里:我想在访问 ListView 时增加一个计数器。或者用你的话来说:我想记录一个条目,说明某个模型的列表已被访问。
  • ...没人知道吗?
  • 您找到解决方案了吗?
  • @MohamedAbbase 我发布了我记忆中最好的解决方案。我希望它对你有帮助。万事如意

标签: python django analytics mixins


【解决方案1】:

因此,此答案无法保证有效。我在问这个问题时实现了这个解决方案,但我不再使用它,因为我从我的 django 应用程序中删除了这个功能。一个原因是沉重的负担。因为在这个解决方案中,每次有人访问该网站并将其保存到数据库时,我都会创建一个对象。这工作正常,但一段时间后对数据库来说变得非常沉重。

首先,我创建了一个新应用并将其命名为analytics。在应用程序中,我创建了这样的模型:

class UrlTime(models.Model):
    associated_url = models.CharField(blank=True, null= True, max_length=250)
    timestamp = models.DateTimeField(auto_now=True, blank=True)

    def __str__(self):
        return self.associated_url

我创建了一个名为middleware.py 的新模块。中间件基本上在调用视图之前或调用视图之后执行代码(取决于您放置代码的位置)。如果您计算 URL,我认为最好在调用视图之前拥有它:

中间件.py

from .models import UrlTime

class GetUrlMiddleware():
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # before view
        # creates a counter object for URL if url doesn't exist. Else counts up.
        if request.path.startswith('/admin/'):  ##exclude what you don't want to count
            pass
        else:
            # urltrack, _ = UrlTrack.objects.get_or_create(url=request.path)
            # urltrack.counter = F('counter') + 1
            # urltrack.save()

            urltime = UrlTime.objects.create(associated_url=request.path)
            urltime.save()

        response = self.get_response(request)
        # after view

        return response

有了这个,您应该能够在每次有人访问该页面时计算您的网址。将在数据库中创建一个对象。然后你只需要在模板上显示你想要的方式。我做了这样的事情:


class AnalyticsIndexView(StaffRequiredMixin, ListView):
    template_name = 'analytics_list.html'
    model = UrlTime

    def get_context_data(self, **kwargs):
        context = super(AnalyticsIndexView, self).get_context_data(**kwargs)
        context['object_viewed_list'] = ObjectViewed.objects.all()
        context['url_views_list'] = UrlTime.objects.all()
        context['total_views'] = UrlTime.objects.all().count
        counting = UrlTime.objects.all().values('associated_url').annotate(url_count=Count('associated_url'))
        context['home_view'] = counting
        context['start'] = UrlTime.objects.first()

        return context

那么你只需要实现模板......如果你也需要,请告诉我,我也在这里发布。

【讨论】:

    猜你喜欢
    • 2017-12-31
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多