Друзья
У меня есть приложение 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)
Если я должен предоставить больше кода, пожалуйста, дайте мне знать.
Любая помощь высоко ценится ...