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.

Podobne dokumenty