【发布时间】: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