Aule Blog - PythonAnywhere

Transkrypt

Aule Blog - PythonAnywhere
Pobrano z http://aule.pythonanywhere.com/
Jak powstawał ten blog [część
VIII]
23 sierpnia 2015 popełniony przez aule
Dzisiaj będzie o czymś czego nie zakładałem że będzie na blogu. Chodzi o
kalendarz ze standardowej biblioteki Pythona napisany tak żeby umiało
interpretować go Django, który jest umieszczony nad blokiem do
wyszukiwania o którym było ostatnio.
Całość zaczęła się wątku na polskim forum Pythona. Chodzi dokładnie o ten
wątek (https://pl.python.org/forum/index.php?topic=5700.msg24534). Post
ten jest praktycznie powieleniem mojej wypowiedzi z forum.
Do modelu który przedstawiałem tutaj na blogu należy dodać:
def get_absolute_url(self):# dodane w zwiazku z kalendarzem sluzy do
okreslania adresu
return "/artykul/%i/" % self.i
Dzięki temu upraszczamy sobie zachowanie i tworzymy regułę dla
linkowania dla kalendarza.
Dodajemy teraz klasę dla kalendarza w naszym views.py
from
from
from
from
calendar import HTMLCalendar
datetime import datetime, date
itertools import groupby
django.utils.safestring import mark_safe
class WorkoutCalendar(HTMLCalendar):
def __init__(self, workouts):
super(WorkoutCalendar, self).__init__()
self.workouts = self.group_by_day(workouts)
def formatday(self, day, weekday):
if day != 0:
cssclass = self.cssclasses[weekday]
if date.today() == date(self.year, self.month ,day):
cssclass += ' dzis'
if day in self.workouts:
cssclass += ' wpis'
linkp= []
linkk= []
for workout in self.workouts[day]:
linkp.append('' % workout.get_absolute_url())
linkk.append(' (%s)')
return self.day_cell(cssclass,'%s %s %s' % (''.join
(linkp), day,''.join(linkk) ))
return self.day_cell(cssclass, day)
else:
return ' '
def day_cell(selfself, cssclass, body):# funkcja dla dni zeby za
kazdym razem nie pisac html
return '%s' % (cssclass, body)
def formatmonth(self, year, month, withyear=True):
self.year, self.month = year, month
v = []
a = v.append
a('')
a('\n')
a(self.formatmonthname(year, month, withyear=withyear))
a('\n')
a(self.formatweekheader())
a('\n')
for week in self.monthdays2calendar(year, month):
a(self.formatweek(week))
a('
')
return ''.join(v))
def group_by_day(self, workouts):# fukcja dla grupowania
field = lambda workout: workout.data_pub.day # pole z modelu gdzie
jest data
return dict(
[(day, list(items)) for day, items in groupby(workouts, field)]
)
Wyjaśnienia można znaleźć w wątku na forum. Jeśli ktoś miałby jeszcze
jakieś pytania to śmiało proszę o komentarza ;).
Teraz jeszcze należy zmodyfikować widok artykuly:
def artykuly(request):
page = request.GET.get('page')
wszystkie = Artykul.objects.all().order_by('-data_pub')
page_filter = paginacja(page, wszystkie)
arg= {} #potrzebne do wyszukiwania ajaxa
arg.update(csrf(request))
# nie przyszedl mi do glowy inny pomysl jak to napisac
year = date.today().year
month = date.today().month
my_workouts = Artykul.objects.order_by('data_pub').filter
(data_pub__year=year, data_pub__month=month)
cal = WorkoutCalendar(my_workouts).formatmonth(year, month)
return render (request, 'blog/artykuly.html', {'page_filter' :
page_filter, 'arg':arg ,'cal':mark_safe(cal)})
Generalnie tylko tyle albo aż tyle bo zrozumienie tego jak to działa zajęło mi
prawie dwa dni. Teraz jestem trochę mądrzejszy zobaczymy na jak długo... ;)

Podobne dokumenty