Gratter les conditions météorologiques pour les pics de montagne

Aug 20 2020

J'ai construit un site Web dans Django dans lequel j'ai essayé pour la première fois de créer une application complexe. C'est une application qui gratte les conditions météorologiques sur un sommet de montagne, qui sont 17. Je voulais montrer une prévision détaillée dans des modèles séparés, j'ai donc 17 vues qui se ressemblent presque.

Seulement 4 vues :

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

Seul le nom de la classe de vue et context['Peak']sont différents. Le reste du code est redondant. Comme mon expérience est basée uniquement sur mon processus d'auto-apprentissage, je n'ai trouvé aucune solution intéressante sur la façon de corriger ou de refactoriser.

Réponses

2 fabrizzio_gz Aug 20 2020 at 09:34

Une option consiste à modifier votre TemplateViewclasse pour inclure le nom du pic en tant qu'attribut d'instance (par exemple peak_name) et à en faire l' get_context_datautilisation par la méthode :

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

Et ensuite, vous pouvez générer vos pics de vues en tant qu'instances de cette classe :

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