admin 0Comment

W ostatnim wpisie dotyczącym mojego konkursowego projektu, czyli aplikacji webowej yourFinance, informowałem jak można rozszerzyć funkcjonalność modelu użytkownika w Django. Dzisiaj kilka słów o mniejszym wycinku mojej appki, a konkretnie – o wyborze danych do zanalizowania. Przede wszystkim jednak – dlaczego chcę dopuścić do tego, by użytkownik mógł zatwierdzić pusty formularz?


Poza prostą funkcjonalnością CRUD chciałbym by moja ćwiczeniowa aplikacja webowa wykonywała też jakieś, chociażby podstawowe, działania na kolekcjonowanych danych. Stwierdziłem, że skoro zajmuje się ona gromadzeniem finansowych danych związanych z budżetem, użytkownik będzie mógł przeprowadzić prostą analizę danych z danego okresu. Początkowo funkcję zaimplementowałem w dwóch opcjach menu, określonych jako Analyze recent data oraz Analyze chosen data. W pierwszej opcji, program wyszukiwał najaktualniejsze informacje o stanie finansowym po czym analizował je, w drugiej opcji natomiast pozwoliłem użytkownikowi wpisać datę i analizować informacje finansowe zapisane wraz z tą datą.

Ostatecznie stwierdziłem jednak, że obie te opcje mogą być zamieszczone w jednej opcji menu (określonej po prostu jako Analyze data), która przeniesie użytkownika do strony, na której będzie mógł wpisać datę lub też, jeżeli zatwierdzi pusty formularz, aplikacja uzna, że chce przeanalizować najaktualniejsze dane finansowe, umieszczone w bazie danych.

 

 

Dzięki skorzystaniu z możliwości wysłania pustego formularza, użytkownik może w tym jednym miejscu zadecydować czy chce przeanalizować dane dla konkretnej daty czy też te, które są najaktualniejsze (to określone jest na podstawie daty a nie momentu, w którym użytkownik zapisał te dane).

Jak umożliwić we frameworku Django zatwierdzenie pustego formularza? Zobaczmy najpierw jak wygląda odpowiadający za to widok:

@login_required
def analyze_data(request):
    """Possibility to decide if analyze last data entries or choose date."""
    message = "Provide date for which you would like your data to be " \
              "analyzed. Press 'submit' button without given date to " \
              "analyze newest record. If you'll choose date for which " \
              "there are no data, records closest to the date (but not" \
              " after it) will be taken."
    if request.method == 'POST':
        form = DateForm(request.POST)
        if form.is_valid():
            date = form.cleaned_data['date']
            if form.cleaned_data['date'] == None:
                date = '9999-12-31'
            return redirect('analyze record', date=date)
    form = DateForm()
    return render(request,
                  'yourFinance/data_form.html',
                  {'form': form, 'message': message})

A, skoro korzysta on z formularza DateForm, spójrzmy i na niego:

class DateForm(forms.Form):
    date = forms.DateField(required=False)

Jak widać, możliwość wykorzystania pustego formularza wynika z ustawienia pola date w formularzu jako niewymagany (required=False), a także z określenia, co widok powinien robić w sytuacji gdy zatwierdzony został formularz bez danych dla pola date (if form. cleaned_data[‚date’] == None:).

Jako, że widok ten przekieruje do kolejnego (który zajmuje się już logiką analizy danych), podając jednocześnie datę jako jego argument, na tę chwilę zdecydowałem, że w przypadku niewpisania przez użytkownika daty, przesłana zostanie domyślna, o wartości ‚9999-12-31’. Zdaję sobie sprawę, że nie jest to najlepsze rozwiązanie i w najbliższym czasie mam zamiar zmienić je na lepsze. Na jakie konkretnie? Wszelkie sugestie mile widziane 😉

Może was też dziwić, dlaczego, stosunkowo długi, tekst do wyświetlenia na stronie przekazywany jest z poziomu widoku, w zmiennej message. Wynika to z tego, że z szablonu o nazwie data_form.html (czyli tego, w którym wyświetlę ten tekst) korzystam także w innych widokach. Aby był on uniwersalny wystarczy przekazywać do niego wiadomość poprzez zmienną a nie zapisywać ją na stałe w HTML-u.

Można też zapytać, co w przypadku, gdy użytkownik wpisze datę, dla której nie ma zapisanych danych, które program mógłby zanalizować. Jak widać w tekście wiadomości przekazanej do szablonu, taka opcja jest wzięta pod uwagę w kodzie zajmującym się już stricte analizą sum umieszczonych w obiektach modelu Stash.

A jak wygląda analiza danych w programie? O tym następnym razem.

Dodaj komentarz