Django ListView 如何在类内所有方法中指定变量

5 投票
1 回答
4952 浏览
提问于 2025-04-17 01:21

我的网址里有一个叫“shop_name”的变量。

还有一个商店模型,里面有一个“name”字段。

在我的列表视图类中,我需要多次查询商店模型,以从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

我的问题是,有什么好的方法可以让某个变量(在这个例子中是商店)在所有方法中都能用到?我不是python高手(这可能是根本问题)。我尝试过重写init方法,但那样我无法获取urls.py中指定的exchange_name,从而得到正确的“商店”实例。我想避免重复的操作。

谢谢

1 个回答

4

把它保存在 self.shop 里。

get_queryset 是第一个被调用的方法(可以查看 BaseListView 的 get 方法代码)。所以一个解决办法就是在这里获取你的变量,就像你在代码中做的那样,然后也把它保存到 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()]

撰写回答