gpt4 book ai didi

django - 如何使 reverse_lazy() 也懒惰的参数?

转载 作者:行者123 更新时间:2023-12-04 14:46:51 30 4
gpt4 key购买 nike

介绍

对于特定需求(django-jqgrid),我定义了一个类(代表 Grid ),我必须在其中提供一个 url属性。由于我只使用反向 URL(没有静态定义),我使用 reverse_lazy()对于这件事。

只要我不必将参数传递给 reverse_lazy(),这就会很有效。 .但是,如果我想做那个 Grid特定于一个对象(这里是 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' .

第二次尝试

代码

所以我尝试使用 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() ?

最佳答案

django.utils.functional.lazy()返回一个惰性求值的可调用对象,换句话说,它为您提供了一个返回惰性值的函数。

见示例:

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, })

关于django - 如何使 reverse_lazy() 也懒惰的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15703475/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com