Как отслеживать ListView, другие виды и URL-адреса с помощью Mixins в приложении Django - PullRequest
0 голосов
/ 18 апреля 2019

Друзья

У меня есть приложение Django, и я хочу добавить базовое отслеживание для всех моих просмотров. (Очень похоже на счетчик или что-то подобное)

Пока что я могу отслеживать конкретные объекты с помощью миксинов. Поэтому каждый раз, когда кто-то нажимает на экземпляр моей модели (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)

Если я должен предоставить больше кода, пожалуйста, дайте мне знать.

Любая помощь высоко ценится ...

...