6

序章

特定のニーズ (django-jqgrid) のために、属性Gridを提供する必要があるクラス (を表す) を定義します。url私は逆引き URL (静的に定義されたものは何もない) のみを使用するreverse_lazy()ため、この件については を使用します。

に引数を渡す必要がない限り、これはうまく機能しreverse_lazy()ます。Gridただし、これをオブジェクト (ここでは a ) に固有のものにしたい場合はDocumentSet、このurl引数もそのオブジェクトに固有である必要があるため、reverse_lazy() に引数を提供する必要があります。

オブジェクトの属性として定義したため、実行時に にアクセスできます。また、これに対してDocumentSet呼び出される最初の関数Gridがこのオブジェクトを引数として取り、属性を正​​しく設定するようにします。

最初の試み

コード

私はこのコードを使用してみました:

class DocumentGrid(JqGrid):
    documentset = None
    model = Document
    url = reverse_lazy('document-grid-handler', kwargs = {'pk' : documentset.id, })

    def get_queryset(self, request):
        return self.documentset.documents
    def get_json(self, request, documentset):
        self.documentset = documentset
        return super(DocumentGrid, self).get_json(request)

エラー

ただし、もちろん、ファイルがインポートされると、これは失敗しますNoneType object has no attribute 'id'

2 回目の試行

コード

そこでdjango.utils.functional.lazy()、この些細で愚かな関数をモデルに追加して、 を使用してみました:

def get_id(self):
    return self.id

そして、このコードを使用して:

class DocumentGrid(JqGrid):
    documentset = DocumentSet
    model = Document
    url = reverse_lazy('document-grid-handler', kwargs = {'pk' : lazy(documentset.get_id, int), })

    def get_queryset(self, request):
        return self.documentset.documents
    def get_json(self, request, documentset):
        self.documentset = documentset
        return super(DocumentGrid, self).get_json(request)

エラー

Django が文句を言うことなく、ファイルが正しくインポートされるようになりました。ただし、実行時に次のエラーが発生します。

Reverse for 'document-grid-handler' with arguments '()' and keyword arguments '{'pk': <function get_id at 0x1a07410>}' not found.

結論

これは正しい方法ですが、小さな間違いを犯していますか? それとも、遅延評価に関するすべてを誤解していたので、まったく別のアプローチを取り、書き直す必要がありreverse_lazy()ますか?

4

1 に答える 1

8

django.utils.functional.lazy()遅延評価された callable を返します。つまり、遅延値を返す関数を提供します。

例を参照してください:

l = lazy(lambda : 42, str)
unicode(l)  # returns u'<function <lambda> at 0x3a5bcf8>'
lazy_value = l()
unicode(lazy_value)  # returns u'42'

self.documentsetただし、関数内のフィールドを置き換える場合get_json、遅延呼び出しで間違った結果が得られる可能性があります。古いものを使用しDocumentSetます。

JqGrid別の解決策があるからです。JqGridはメソッドを提供します。get_urlデフォルトでは単に を返しますself.url。ただし、この動作をオーバーライドできます。

class DocumentGrid(JqGrid):
    documentset = None
    model = Document
    url = None

    def get_queryset(self, request):
        return self.documentset.documents

    def get_json(self, request, documentset):
        self.documentset = documentset
        return super(DocumentGrid, self).get_json(request)

    def get_url(self):
        return reverse('document-grid-handler', kwargs = {'pk' : self.documentset.id, })
于 2013-03-29T13:26:37.070 に答える