Pardonne-moi si je pose des questions très stupides.
J'essaye d'obtenir le nom des mois passés au lieu des nombres mon framework django:
Exemple: Par exemple, si je avoir 12
, je veux retourner décembre ou décembre
En ce moment, j'avais ces scripts python externes qui trient le jour, les semaines, le mois et les années .
Voici les codes des scripts externes Nom; basicfun : (uniquement sur les mois)
Exception Type:AttributeError Exception Value:'int' object has no attribute 'strftime'
Il reviendra à ma vue django à utiliser comme filtre pour Queryset
Ici, le cadre fonctionne sur les codes de la vue:
dataset = datetime.now().month - 1 dataset.strftime("%b")
Ce lien: Obtenir le nom du mois à partir du numéro
1.
#Django view def ph(request): query = request.GET.get('dateRange') fill = selectDates(query) data = tank_system.objects.all().filter(datetime__contains=fill) return render(request, 'FrounterWeb/extends/ph.html', {'tank': data})
erreur:
#basicfun codes (external python scripts) def selectDates(query): if query == 'Previous-Months': dataset = datetime.now().month - 1 dataset.strftime("%b") return dataset
3 Réponses :
Votre erreur est due au fait que datetime.now (). month
est un entier. strftime
est une méthode sur l'objet datetime
.
Vous pouvez obtenir le mois en cours en faisant:
month = datetime.now () .strftime ("% b")
Pour obtenir les noms des mois précédents, une manière simple mais "hacky" de le faire serait simplement de créer un dictionnaire des chaînes du mois que vous voulez avec le numéro du mois comme clés:
from datetime import datetime def limit_month_number(start_month, months_ago): """ This function will return a value from 1-12 inclusive. >>> limit_month_number(1,3) -> 10 >>> limit_month_number(12,14) -> 10 """ month_number = start_month - (months_ago % 12) if month_number < 1: month_number = 12 + month_number return month_number def get_prev_month(months_ago): months = {1: 'Jan', 2: 'Feb', 10: 'Oct', 11: 'Nov', 12: 'Dec'} this_month = datetime.now().month month_number = limit_month_number(this_month, months_ago) prev_month = months[month_number] return prev_month print(get_prev_month(2)) # 'Nov', two months ago from now
Aussi, je dois souligner que vous pouvez le faire en utilisant datetime
. Consultez cet autre article: date python du mois précédent
merci Kevin ça marche sur le mois en cours, car le mois précédent comme tu l'as dit est vraiment hacky
L'avantage d'utiliser votre propre dictionnaire est que vous avez le choix d'utiliser l'abréviation ou le nom complet du mois.
Je n'ai pas eu le mois dernier, mais ce mois-ci à la place, je me demande si le virage n'a pas fonctionné?
J'ai modifié le code. Essayez ça. Je vous laisse remplir vous-même les 7 autres mois.
@KevinWelch Vous pouvez réduire le «piratage» en utilisant le module calendrier de la bibliothèque standard pour fournir les noms de mois - voir les attributs month_name
et month_abbr
.
Utilisez relativedelta
.
>>> [(dt.date.today() - relativedelta(months=x)).strftime('%B') for x in range(3, 0, -1)] ['October', 'November', 'December']
Au cours des trois derniers mois, vous pouvez utiliser une compréhension de liste:
from dateutil.relativedelta import relativedelta today = dt.date.today() # 2019-01-03 >>> (today - relativedelta(months=1)).strftime('%B') # `%b' for abbreviated month 'December'
Avez-vous besoin d'installer relativedlta? car #from detutil.relativedelta import relativedelta # Django ne reconsidère pas
Essayez ceci
previous_month = (datetime.date.today().replace(day=1) - datetime.timedelta(days=1)).strftime('%B')