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... ;)