在Django 1.5基于类的视图中访问URL变量

时间:2013-09-18 14:42:57

标签: 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)
        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并用于确定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_id kwarg的新名称。显然,这段代码不起作用,因为我无法访问函数之外的self。但我不确定如何做到这一点。我需要将pk设置为关键字参数中的某些内容,但无法找到执行此操作的方法,因为需要在任何函数之外的类主体中设置pk。我也没有办法进行实验和尝试,因为由于函数调用已被弃用,整个项目现在都被打破了。

谢谢!

1 个答案:

答案 0 :(得分:1)

我不确定您认为pkobject_id的新名称,以及为什么您认为需要将其设置为每个请求的值。基于类的视图中的类级属性的要点是它们是按视图类设置的,而不是按实例设置的:它们指的是视图将查找值的位置,而不是实际值本身。

您的第一个错误是,相当于旧的object-detail视图,DetailView,而非ListView并不奇怪。如文档所示,ListView可以通过SingleObjectMixin的继承来显示对象详细信息。 mixin需要一个名为pk_url_kwarg的类级属性,它是从URL中捕获的参数的名称,用于标识对象的PK:在您的情况下,这是 string {{1 }}。实例本身负责在任何特定请求中查找该值,您不需要这样做。