1

跟进这个线程:django: How do I hash a URL from the database object's primary key? ,我想对用户隐藏主键并Detailview在我的 urlconf 中使用。我能够在大多数情况下使用按位 XOR 来完成这种隐藏(它在我的视图函数中工作),直到我必须“取消屏蔽”在 url 中发送到我的子类的屏蔽主键的部分DetailView.

如何在将 pk_masked 命名组发送到我的DetailViewFilteredOnUser(DetailView)实例之前“取消屏蔽”它?有没有办法mask_toggle(pk_unmasked)在 urlconf 中发送给我对 DetailViewFilteredOnUser 的调用?在寻找解决方案时,我pk_url_kward在 Django 文档中找到了一些内容,但我无法让它工作,而且无论如何我认为这不能帮助我对 DetailView 操作的主键执行操作。

这是我的屏蔽功能:

def mask_toggle(number_to_mask_or_unmask):
    return int(number_to_mask_or_unmask) ^ settings.MASKING_KEY

我的模型是包含“项目”的“pkgs”:

class Pkg(models.Model):
    user = models.ForeignKey(User, editable=False)
    tracking_number = models.CharField(max_length=60, unique=True)

class Item(models.Model):
    pkg = models.ForeignKey(Pkg)
    description = models.CharField(max_length=300)

这是我的 urls.py 中的内容:

class ListViewFilteredOnUser(ListView):
    def get_queryset(self):
        return Pkg.objects.order_by('-created_at').filter(user=self.request.user)

class DetailViewFilteredOnUser(DetailView):
    def get_queryset(self):
    qs = super(DetailViewFilteredOnUser, self).get_queryset()
        return qs.filter(user=self.request.user)

....

url(r'^(?P<pk_masked>\d+)/$',
    login_required(DetailViewFilteredOnUser.as_view( model=Pkg,
                        template_name='pkgs/detail.html'
                        )), 
    name='detail'),

所以问题是,如果我的 urlconf 中的命名组是“pk”,那么一个被屏蔽的主键(因为被屏蔽的键是 url 中的内容)被发送到 DetailView。如果我的 urlconf 中的命名组是“pk_masked”,那么我需要在pk=mask_toggle(pk_masked)某个地方做,我不知道在哪里或如何做。谢谢。

4

1 回答 1

1

如果我正确理解了您的问题,则需要覆盖get_object(这get_queryset几乎无关紧要,但为了清楚起见,您仍然可以使用它)。就像是:

class DetailViewFilteredOnUser(DetailView):
    model = Pkg
    template_name = 'pkgs/detail.html'
    def get_queryset(self):
        return super(DetailViewFilteredOnUser, self).get_queryset().filter(user=self.request.user)
    def get_object(self):
        return self.get_queryset().get(pk=mask_toggle(self.kwargs.get("pk_masked"))

(当然,不要忘记捕捉异常,为了清晰和简洁,我把它省略了。)

于 2013-04-25T22:27:32.147 回答