Gratter les conditions météorologiques pour les pics de montagne
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
Une option consiste à modifier votre TemplateView
classe pour inclure le nom du pic en tant qu'attribut d'instance (par exemple peak_name
) et à en faire l' get_context_data
utilisation 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')