2013-04-25 71 views
1

繼續關注此線程:django: How do I hash a URL from the database object's primary key?,我想隱藏用戶的主鍵並在我的urlconf中使用Detailview。我能做到使用按位異或大部分這個隱藏(但在我看來職能工作),直到我的地方,我不得不「揭露」這是在URL發送到我的子類的蒙面主鍵的一部分DetailViewDjango:隱藏主鍵(pk)並使用DetailView和get_queryset

我怎麼把它發送到我的DetailViewFilteredOnUser(DetailView)實例之前,「揭露」我pk_masked命名組?有沒有辦法送mask_toggle(pk_unmasked)我呼籲DetailViewFilteredOnUser權URL配置?在尋找解決方案,我發現了一些關於Django文檔中pk_url_kward,但我無法得到它的工作,反正我不認爲能幫助我在那的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)的地方,我想不出哪裏或如何做到這一點。謝謝。

回答

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")) 

(當然,不要忘了捕捉異常,我離開是出於對清晰和簡潔。)

+0

您好貝里斯拉夫,非常感謝這一點 - 它完美的作品!我想到我用來屏蔽PK的按位XOR「加密」解決方案可能很容易被破解。我可能會嘗試使用不同的遮罩算法。如果我這樣做,它會工作,我會在這裏發佈解決方案。乾杯, – 2013-04-26 10:58:47

+0

我認爲它應該可以用於所有實際目的,但您可能希望查看'pycrypto'庫。 – 2013-04-26 23:19:36

相關問題