django ListView, определяющий переменную, доступную для всех методов внутри класса - PullRequest
3 голосов
/ 04 сентября 2011

В моем URL есть ключевое слово "shop_name". Также есть модель магазина с полем «имя».

В моем классе ListView мне нужно делать повторяющиеся запросы к модели Shop, чтобы получить переменную unicode из метода Shop.get_type (). В зависимости от результата выбирается правильный каталог шаблонов или набор запросов (с использованием подклассовых моделей 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

Вопрос в том, что является лучшим способом, чтобы я мог получить некоторую переменную (в данном случае магазин) для всех методов? Я не гуру питона (может быть основная проблема). Я пытался переопределить init , но потом я не смог получить exchange_name (указанный в urls.py), чтобы получить правильный экземпляр "shop". Я хотел бы избежать повторения.

Спасибо

1 Ответ

3 голосов
/ 04 сентября 2011

Сохраните его в self.shop.

get_queryset является первым вызванным методом (см. код для метода get BaseListView ). Поэтому одним из решений было бы получить вашу переменную там же, как вы делаете это в своем коде, а затем также сохранить ее в 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()]
...