2

我是 django 的新手,正在从事一个项目,我需要在他们的个人资料页面上显示注册用户的最后访问页面。我通过在我想要保留历史记录的主要对象中添加一个新的 many2many 字段,在我的扩展用户类中实现了这一点。在我看来,每当成员提出请求时,我都会将该对象添加到成员的历史记录中。但这并没有给我想要的结果。项目未订购,如果用户未登录,则会出现 User DoesNotExist 错误。我知道有比这更好的方法,但我找不到。可能我没有走正确的路。我感谢任何帮助或想法。

class myObjectView(View):
    model = myObject
    template_name = 'app/myobject_detail.html'

    def get(self, request, **kwargs):
        cat = Category.objects.all()
        sec = Section.objects.all()
        self.item = myObject.objects.get(slug = self.kwargs[u'slug'])
        user = User.objects.get(username=request.user.username)

        if user.is_authenticated():
            if self.item in user.member.history.all():
                user.member.history.remove(self.item)
                user.member.history.add(self.item)
                user.save()
            else:
                user.member.history.add(self.item)
                user.save()
4

1 回答 1

4

您的方法有缺点,但如果您需要长期持久性,那也不错。

您可以通过表格轻松地在 m2m 中添加一个ordering字段(查看文档)以添加一些排序感。您还可以通过表的 PK 对 m2m 进行排序,因为大 PK 值将意味着根据您当前删除项目并再次添加它们的代码来更新条目。

ordered_item_history = (user.member.history.through.objects
    .filter(user=user, myObject=self.item)
    .order_by('pk').values_list('myObject', flat=True))

也就是说,执行此类操作的最简单方法是在会话中。

request.session.setdefault('history', []).append(myObj)
request.session.modified = True

现在在任何视图中,您都可以通过 访问这个不断增长的对象历史列表request.session['history']。根据需要进行修改以消除重复项。

于 2013-06-13T21:50:15.093 回答