Wersja PDF - Aule Blog
Transkrypt
Wersja PDF - Aule Blog
Pobrano z http://aule.pythonanywhere.com/ Modyfikacja i obsługa kalendarza na stronie 12 września 2015 popełniony przez aule Wreszcie jest chwila czasu więc na spokojnie mogę dodać kolejny wpis. Co prawda miałem już nie modyfikować bloga w najbliższym czasie ale była jedna rzecz która zaczęła mnie denerwować. Jak kiedyś pisałem postanowiłem nie robić typowego archiwum tylko zrobić wyszukiwarkę wpisów. Wyszukiwarka działa ale w tak zwanym międzyczasie dodałem kalendarz i to właśnie w nim zaczęło denerwować mnie brak możliwości wybrania innego miesiąca. Niestety klasa wyglądała jak wyglądała więc trzeba było ja trochę zmodyfikować. Oczywiście jak to w życiu bywa żeby nie było łatwo i przyjemnie trzeba było również zmodyfikować jeden z widoków. Zacznę od przedstawienia klasy dla kalendarza: 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):#nie trzeba okreslac czym jest mont i year 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): return '%s' % (cssclass, body) #modyfikacja funkcji dla widoku miesiaca def formatmonth(self, year, month, withyear=True):#zastąpione theyear, themonth self.year, self.month = year, month #podanie funkcji czym jest year oraz month v = [] a = v.append a('') a('\n') a(self.formatmonthname(year, month, withyear=withyear))#zastąpione theyear, themonth a('\n') a(self.formatweekheader()) a('\n') for week in self.monthdays2calendar(year, month):#zastąpione theyear, themonth a(self.formatweek(week)) a(' ') return ''.join(v) def group_by_day(self, workouts): field = lambda workout: workout.data_pub.day return dict( [(day, list(items)) for day, items in groupby(workouts, field)] ) Taka modyfikacja sprawiła to iż nie podkreślał się numer aktualnego dnia w każdym miesiącu i można bez problemu zmieniać miesiące. Teraz tak wiedząc jakie argumenty trzeba przekazać do klasy trzeba było pomyśleć jak zrobić żeby za wciśnięciem guzika pojawiał się kolejny miesiąc. Wyszło na to że będzie przekazywać zmienną do widoku tak aby nią sterować. Potrzebna za tym była modyfikacja widoku dla pokazywania wszystkich artykułów. def artykuly(request): page = request.GET.get('page') wszystkie = Artykul.objects.all().order_by('-data_pub') page_filter = paginacja(page, wszystkie) arg= {} arg.update(csrf(request)) year = date.today().year month = date.today().month wartosc_startowa = 0#wartosc dla przycisku obslugujacego poprzedni_miesiac = request.GET.get('pm')#wartosc zmienej ustalana na podstawie danych pobranych try:#zabezpieczenie przed wywawaleniem poprzedni_miesiac = poprzedni_miesiac except ValueError: poprzedni_miesiac = None aktualny_miesiac = request.GET.get('am')#pobranie wwartosci dla aktualnego miesiaca try:#zabezpieczenie przed wywawaleniem aktualny_miesiac = aktualny_miesiac except ValueError: aktualny_miesiac = None if poprzedni_miesiac != None: ny = month - int(poprzedni_miesiac) if ny <= 12 and ny >= 1:#zabezpieczenie tak aby kalenadarz dzialal w obrebi jednego roku wartosc_startowa = wartosc_startowa + int (poprzedni_miesiac) my_workouts = Artykul.objects.order_by('data_pub').filter (data_pub__year=year, data_pub__month=ny) cal = WorkoutCalendar(my_workouts).formatmonth(year,ny) return render (request, 'blog/artykuly.html', {'page_filter' : page_filter, 'arg':arg,'cal': mark_safe(cal), 'poprzedni_miesiac':poprzedni_miesiac, 'wartosc_startowa':wartosc_startowa} ) elif aktualny_miesiac != None: return render (request, 'blog/artykuly.html', {'page_filter' : page_filter, 'arg':arg ,'cal':mark_safe(cal)}) else: my_workouts = Artykul.objects.order_by('data_pub').filter (data_pub__year=year, data_pub__month=month) cal = WorkoutCalendar(my_workouts).formatmonth(year, month) else: 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)}) Do obsługi kalendarza doszły w base.html dwa przyciski umieszczone wewnątrz formularza. Zrobiłem to za pomocą formularza gdyż była to jedyna rzecz jaka przyszła mi do głowy i jaką do tej pory znam. <form method="get" class="form-inline" id="cell"> <button type="submit" class="btn btn-sm" id="guzik" name="pm" value="{{wartosc_startowa}}"><span class="glyphicon glyphicon-arrowleft"></span> Poprz. Miesiąc</button> <button type="submit" class="btn btn-sm" name="am" value="1">Akt. Miesiąc</button> </form> Pozostało teraz stworzyć coś co pozwala po naciśnięciu przycisku zmieniać jego value. Z pomocą przyszło jquery. Skrypt skleiłem z tego co udało znaleźć mi się w internecie. <script> $(document).ready(function() { $('#guzik').click(function() { $total = Number($('#guzik').val()) + 1; $("#guzik").prop('value', $total); }); }) </scrip> Tak oto udało mi się uzyskać efekt który chciałem. Zapewne będę go jeszcze modyfikował gdy stwierdzę że potrzebna jest obsługa poprzednich lat ;) Bardziej spostrzegawczy czytelnicy mogli zauważyć iż nie ma przycisku do kolejnych miesięcy. Nie ma go ponieważ tak jak pisałem kalendarz ma pełnić rolę archiwum.