我的网址有一个关键字“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”实例。我想避免重复。
由于
答案 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()]