Python 在Django 1.5基于类的视图中访问URL变量
我正在将一个项目从Django 1.2迁移到Django 1.5。项目使用基于功能的视图,例如:Python 在Django 1.5基于类的视图中访问URL变量,python,django,Python,Django,我正在将一个项目从Django 1.2迁移到Django 1.5。项目使用基于功能的视图,例如: def notecard_product(request, stockcode): if request.user.is_authenticated(): liked = Recommendation.objects.values_list('product_id',flat=True).filter(recommended=True, user=request.user)
def notecard_product(request, stockcode):
if request.user.is_authenticated():
liked = Recommendation.objects.values_list('product_id',flat=True).filter(recommended=True, user=request.user)
unliked = Recommendation.objects.values_list('product_id',flat=True).filter(recommended=False, user=request.user)
extra_context = {"liked" : liked, "unliked":unliked}
else:
extra_context = {"liked" : [0], "unliked": [0]}
return object_detail(request, queryset=Product.objects.live(),
object_id=stockcode,
extra_context=extra_context,
template_name='products/notecard.html', template_object_name='notecard_product')`enter code here`
在本摘录中,stockcode
从URL中捕获,并用于确定对象id
。因此,我想知道如何在基于类的视图中实现这一点。这就是我到目前为止所做的:
class NotecardProductListView(ListView):
queryset=Product.objects.live()
pk=self.kwargs['stockcode']
template_name='products/notecard.html'
context_object_name='notecard_product'
def get_context_data(self, **kwargs):
context = super(BooksListView, self).get_context_data(**kwargs)
if self.request.user.is_authenticated():
liked = Recommendation.objects.values_list('product_id',flat=True).filter(recommended=True, user=self.request.user)
unliked = Recommendation.objects.values_list('product_id',flat=True).filter(recommended=False, user=self.request.user)
extra_context = {"liked" : liked, "unliked":unliked}
else:
extra_context = {"liked" : [0], "unliked": [0]}
context.update(extra_context)
return context
pk
是旧object\u id
kwarg的新名称。显然,这段代码不起作用,因为我无法访问函数之外的self
。但我真的不知道该怎么做。我需要在关键字参数中设置pk
,但找不到这样做的方法,因为pk
需要在任何函数之外的类主体中设置。我也没有真正的方法去试验和尝试,因为整个项目现在因为不推荐的函数调用而被破坏了
谢谢 我不知道你是从哪里想到
pk
是object\u id
的新名称,也不知道你为什么认为需要将它设置为每个请求的值。基于类的视图中的类级属性的要点是,它们是按视图类而不是按实例设置的:它们指的是视图查找值的位置,而不是实际值本身
您的第一个错误是,旧的
对象详细信息
视图的等价物是详细信息视图
,而不是列表视图
。如文档所示,ListView能够通过从的继承来显示对象细节。mixin需要一个名为pk\u url\u kwarg
的类级属性,该属性是从标识对象pk的url捕获的参数的名称:在您的例子中,这是字符串“stockcode”
。实例本身负责在任何特定请求中查找该值,您不需要这样做。在新视图中,您需要在哪里使用该pk
值?非常感谢。我把object_列表和object_细节搞混了,所以这是我的问题之一。出于某种原因,我在类属性方面真的很愚蠢。这就是我对pk
变量感到困惑的地方。事实上,我还是有点困惑。引用:“在DetailView
上,object\u-id
视图的object\u-id
参数已被重命名为pk
”,所以你的意思是,我应该设置pk\u-url\u-kwarg='stockcode'
,而不必担心pk
或object-id
?我认为这是个糟糕的措辞。正如SingleObjectMixin文档所示,“默认情况下,pk_url_kwarg是‘pk’”——因此迁移文档混淆了参数值和属性名称。但是是的,你应该按照你描述的去做。好的,很好。我想我只是把事情弄得太复杂了。基于类的泛型视图确实很有意义,但我希望迁移文档更详细一点。谢谢你,你帮了我大忙!