1

このスレッドのフォローアップ: django: データベース オブジェクトの主キーから URL をハッシュするにはどうすればよいですか? 、主キーをユーザーから隠し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

私のモデルは、「アイテム」を含む「パッケージ」です。

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 に答える