산을 엿볼 수있는 기상 조건

Aug 20 2020

저는 Django에서 처음으로 복잡한 앱을 만들려고 시도한 웹 사이트를 구축했습니다. 17 개 산봉우리의 기상 조건을 긁어내는 앱입니다. 별도의 템플릿으로 상세한 일기 예보를 보여주고 싶었 기 때문에 거의 똑같이 보이는 17 개의 뷰가 있습니다.

단 4 개의 조회 :

class KasprowyWierchForecastView(TemplateView):
    """
    class for rendering view of detailed weather forecast for
    Kasprowy Wierch peak
    """
    template_name = 'mountain_base.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['Peak'] = PeakForecast.objects.filter(
            name_of_peak='Kasprowy').order_by('date')
        print(context['Peak'])
        return context


class KoscielecForecastView(TemplateView):
    """
    class for rendering view of detailed weather forecast for
        Koscielec peak
    """
    template_name = 'mountain_base.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['Peak'] = PeakForecast.objects.filter(
            name_of_peak='Koscielec').order_by('date')
        return context


class KrivanForecastView(TemplateView):
    """
    class for rendering view of detailed weather forecast for Krivan peak
    """
    template_name = 'mountain_base.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['Peak'] = PeakForecast.objects.filter(
            name_of_peak='Krivan').order_by('date')
        return context


class MieguszowieckiForecastView(TemplateView):
    """
    class for rendering view of detailed weather forecast for
    Mieguszowiecki peak
    """
    template_name = 'mountain_base.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['Peak'] = PeakForecast.objects.filter(
            name_of_peak='Mieguszowiecki').order_by('date')
        return context


class MnichForecastView(TemplateView):
    """
    class for rendering view of detailed weather forecast for
    Mnich peak
    """
    template_name = 'mountain_base.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['Peak'] = PeakForecast.objects.filter(
            name_of_peak='Mnich').order_by('date')
        return context

뷰 클래스의 이름 만 context['Peak']다릅니다. 나머지 코드는 중복됩니다. 내 경험은 내 자기 학습 프로세스에만 기반을두기 때문에 수정하거나 리팩터링하는 방법에 대한 좋은 해결책을 찾지 못했습니다.

답변

2 fabrizzio_gz Aug 20 2020 at 09:34

한 가지 옵션은 TemplateView피크의 이름을 인스턴스 속성 (예 :)으로 포함하도록 클래스 를 수정 peak_name하고 get_context_data메서드가이를 사용하도록하는 것입니다.

class  TemplateView():
    # Class attributes

    def __init__(self, peak_name):
        # Instance attributes
        # ...
        self.peak_name = peak_name

    # Class methods

    # Modification of the get_context_data method
    def get_context_data(self, **kwargs):
        context['Peak'] = PeakForecast.objects.filter(
            name_of_peak=self.peak_name).order_by('date')  #<- Modification here
        print(context['Peak'])
        return context

그런 다음 해당 클래스의 인스턴스로 피크 뷰를 생성 할 수 있습니다.

krivan_view = TemplateView('Krivan')
krivan_view.get_context_data(arg1='arg1', arg2='arg2')