django ListView指定可用于类中所有方法的变量

时间:2011-09-03 21:06:55

标签: python django generics listview views

我的网址有一个关键字“shop_name”变量。 还有Shop模型带有“name”字段。

在我的ListView类中,我需要对Shop模型进行重复查询,以从Shop.get_type()方法获取unicode变量。根据结果​​,选择适当的模板目录或查询集(使用子类django模型)。

这是代码。

class OfferList(ListView):
    def get_template_names(self):
        shop = Shop.objects.get(name=self.kwargs['shop_name'])
        return ["shop/%s/offer_list" % shop.get_type()]
    def get_queryset(self):
        shop = Shop.objects.get(name=self.kwargs['shop_name'])
        Offer = shop.get_offers_model()
        return Offer.objects.all()

    def get_context_data(self, **kwargs):
        # again getting shop instance here ...
        shop = Shop.objects.get(name=self.kwargs['shop_name'])
        context = super(OfferList, self).get_context_data(**kwargs)
        context['shop'] = shop
        return context

问题是什么是最好的方法,所以我可以为所有方法获得一些var(在这种情况下购买)?我不是蟒蛇大师(可能是基本问题)。我尝试使用 init 覆盖,但后来我无法获得exchange_name(在urls.py中指定)以获得正确的“shop”实例。我想避免重复。

由于

1 个答案:

答案 0 :(得分:3)

将其保存在self.shop中。

get_queryset是第一个被调用的方法(参见the code for BaseListView's get method)。因此,一个解决方案是将变量放在那里,就像在代码中一样,然后将其保存到self.shop(就像BaseListView使用self.object_list一样)。

def get_queryset(self):
    self.shop = Shop.objects.get(name=self.kwargs['shop_name'])
    Offer = self.shop.get_offers_model()
    return Offer.objects.all()

然后在你的其他方法中你可以使用self.shop:

def get_template_names(self):        
    return ["shop/%s/offer_list" % self.shop.get_type()]