我正在将项目从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
。我也没有办法进行实验和尝试,因为由于函数调用已被弃用,整个项目现在都被打破了。
谢谢!
答案 0 :(得分:1)
我不确定您认为pk
是object_id
的新名称,以及为什么您认为需要将其设置为每个请求的值。基于类的视图中的类级属性的要点是它们是按视图类设置的,而不是按实例设置的:它们指的是视图将查找值的位置,而不是实际值本身。
您的第一个错误是,相当于旧的object-detail
视图,DetailView
,而非ListView
并不奇怪。如文档所示,ListView可以通过SingleObjectMixin
的继承来显示对象详细信息。 mixin需要一个名为pk_url_kwarg
的类级属性,它是从URL中捕获的参数的名称,用于标识对象的PK:在您的情况下,这是 string {{1 }}。实例本身负责在任何特定请求中查找该值,您不需要这样做。