【问题标题】:Accessing URL variables in Django 1.5 class-based view在 Django 1.5 基于类的视图中访问 URL 变量
【发布时间】:2013-09-23 09:30:21
【问题描述】:

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

谢谢!

【问题讨论】:

  • 您需要在新视图中的哪个位置使用此 pk 值?

标签: python django


【解决方案1】:

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

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

【讨论】:

  • 非常感谢。我将 object_list 与 object_detail 混淆了,所以这是我的问题之一。出于某种原因,我对类属性非常愚蠢。 Here 是我对 pk 变量感到困惑的地方。其实,我还是有点迷茫。引用:“object_detail 视图的 object_id 参数已在 DetailView 上重命名为 pk。”那么你的意思是,我应该只设置pk_url_kwarg='stockcode' 而不必担心pkobject-id
  • 我认为这只是糟糕的措辞。正如 SingleObjectMixin 文档所示,“默认情况下,pk_url_kwarg 是 'pk'。” - 所以迁移文档将参数的值与属性的名称混淆了。但是,是的,您应该按照您的描述进行操作。
  • 好的,很好。我想我只是让一些事情变得太复杂了。基于类的通用视图确实很有意义,但我希望迁移文档更详细一点。不过谢谢,你帮了大忙!
猜你喜欢
  • 2018-02-20
  • 2013-03-08
  • 2014-10-12
  • 2012-02-14
  • 1970-01-01
  • 2015-05-08
  • 2011-09-09
  • 1970-01-01
  • 2012-12-28
相关资源
最近更新 更多