إنشاء هيكل وتقديمه مع سنوات وشهور في Django
-
27-09-2019 - |
سؤال
في تطبيق التدوين الخاص بي ، أحتاج إلى بنية (تم إنشاؤها كمتغير في معالج السياق) الذي سيخزن رقم الأشهر والسنة المقابلة من 5 أشهر متتالية حتى اليوم الحالي. لذلك إذا كان الشهر الحالي هو ديسمبر ، فسيكون لدينا سنة: 2010 وشهور: 12،11،10،9،8. إذا كان شهر يناير سيكون لدينا سنوات 2010: أشهر: 1 والسنوات: 2009 أشهر: 12 ، 11 ، 10 ، 9. هدفي هو إظهار أرشيف في النموذج التالي:
- 2010
- January
- 2009
- December
- November
- October
- September
كيف أقوم بإنشائها وما هي الهيكل الذي يجب أن أستخدمه؟ ثم كيف تظهر ذلك؟ أعتقد أنني بحاجة إلى بعض الهيكل المتداخل ولكن والتي سيكون من الممكن تقديمها في Django <1.2؟
لقد بدأت ذلك بمفردي ولكن فقدت تمامًا في مرحلة ما:
now = datetime.datetime.now()
years = []
months = []
archive = []
if now.month in range(5, 12, 1):
months = range(now.month, now.month-5, -1)
if months:
years = now.year
else:
diff = 5 - now.month
for i in range(1, now.month, 1):
archive.append({
"month": i,
"year": now.year,
})
for i in range(0, diff, 1):
tmpMonth = 12 - int(i)
archive.append({
"month": tmpMonth,
"year": now.year-1,
})
if archive:
years = [now.year, now.year-1]
المحلول
كيف أقوم بإنشائها وما هي الهيكل الذي يجب أن أستخدمه؟
سأذهب مع قائمة من tuples شهرية. هنا تنفيذ عينة. ستحتاج إلى مفيد Python-dateutil مكتبة لجعل هذا العمل.
from datetime import datetime
from dateutil.relativedelta import relativedelta
def get_5_previous_year_months(a_day):
"""Returns a list of year, month tuples for the current and previous
5 months relative to a_day"""
current_year, current_month = a_day.year, a_day.month
first_of_month = datetime(current_year, current_month, 1)
previous_months = (first_of_month - relativedelta(months = months)
for months in range(0, 5))
return ((pm.year, pm.month) for pm in previous_months)
def get_current_and_5_previous_months():
return get_5_previous_year_months(datetime.today())
ثم كيف تظهر ذلك؟
هذه طريقة مبسطة للغاية لإظهارها. أعتقد أنه يمكنك تنظيفه عن طريق استبدال <ul>
عناصر مع <div>
وتصميمها بشكل مناسب.
<ul>
{% for year, month in previous_year_months %}
{% ifchanged year %}
</ul><li>{{ year }}</li><ul>
{% endifchanged %}
<li>{{ month }}</li>
{% endfor %}
</ul>
أين previous_year_months
هل متغير سياق يتوافق مع النتيجة التي تم إرجاعها بواسطة get_current_and_5_previous_months
.