序章
特定のニーズ (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()
ますか?