0

我正在将一个项目从 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)
        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 中捕获并用于确定object_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_idkwarg 的新名称。显然,这段代码不起作用,因为我无法self在函数之外访问。但我不确定如何做到这一点。我需要pk在关键字参数中设置一些东西,但找不到这样做的方法,因为pk需要在任何函数之外的类主体中设置。我也没有办法进行实验和尝试,因为由于不推荐使用的函数调用,整个项目现在都被破坏了。

谢谢!

4

1 回答 1

1

我不确定您从哪里得到pk新名称的想法object_id,也不知道为什么您认为需要将其设置为每个请求的值。基于类的视图中的类级属性的要点是它们是按视图类设置的,而不是按实例设置的:它们指的是视图将去查找值的位置,而不是实际值本身。

您的第一个错误是,旧object-detail观点的等价物毫不奇怪DetailView,不是ListView。如文档所示,ListView 能够通过从SingleObjectMixin. 该 mixin 需要一个名为 的类级别属性pk_url_kwarg,它是从标识对象 PK 的 URL 捕获的参数的名称:在您的情况下,这是string 'stockcode'。实例本身负责在任何特定请求中查找该值,您不需要这样做。

于 2013-09-18T15:30:46.497 回答