djangofantalega: model Season
2 – djangofantalega: model Season
Creare ‘Season’ (stagione) il primo model dell’applicazione e
madre di tutte le tabelle.
L’unico campo nella tabella ‘Season’, sarà ‘name’.
Creare il file fantalega/validators.py con all’interno il
validator da utilizzare:
from django.core.exceptions import ValidationError import re def validate_season_name(name): pattern = '^\d{4}-\d{4}$' if not re.compile(pattern).match(name): raise ValidationError('name %s is not correct: yyyy-yyyy is mandatory'\ % name, params={'name': name},)
Nel file fantalega/models.py creare ora la classe Season.
from django.db import models from fantalega.validators import validate_season_name class Season(models.Model): name = models.CharField(max_length=9, validators=[validate_season_name]) def __unicode__(self): return self.name
Attenzione:
questo validator vale in fase di inserimento dati da interfaccia di Admin.
Qualora i dati fossero inseriti da shell, non sarebbe attivo
Aggiornare il database con la prima migrazione, inserendo le prima tabella:
(venv) >python manage.py makemigrations fantalega Migrations for 'fantalega': fantalega\migrations\0001_initial.py: - Create model Season
confermare con:
(venv) >python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, fantalega, sessions Running migrations: Applying fantalega.0001_initial... OK
Creare la prima Season da shell:
(venv) >python manage.py shell >>> from fantalega.models import Season >>> Season.objects.create(name='2016-2017') ... >>> exit()
Registrare l’amministratore del sito.
python manage.py createsuperuser Username (leave blank to use 'xxxxxxxxxx'): Email address: [email protected] Password: Password (again): Superuser created successfully.
Attivare nel pannello di admin, il model Season appena creato
file fantalega/admin.py
# noinspection PyUnresolvedReferences from django.contrib import admin from .models import Season # Register your models here. admin.site.register(Season)
lanciare il server con il comando:
python manage.py runserver
ed andare alla pagina http://127.0.0.1:8000/admin/
dove verremo reindirizzati alla sezione di login.
Immettere le credenziali appena registrate.
Qualora si volessero aggiungere nuove Season dall’Admin,
entrerebbe in gioco il validator precedentemente creato.
Es. se si creasse una Season con nome ‘season 1’, il validator
solleverebbe un’eccezione:
altrimenti, rispettando il pattern della regex, il tutto andrebbe a buon fine:
Chiaramente non tutto si svolgerà all’interno dell’interfaccia di admin,
pertanto saranno create:
- una url che visualizzerà la lista delle Season, richiamando la vista (view) di competenza;
- la view, richiamata dalla url precedente, che salverà i dati su database o li
richiederà per poi fornirli alla template;
- la template che visualizzerà i dati
Creare la url nel file fantalega/urls.py:
# noinspection PyUnresolvedReferences from django.conf.urls import url # noinspection PyUnresolvedReferences from django.contrib import admin from . import views urlpatterns = [ url(r'^$', views.index, name='index'), # season urls url(r'^seasons/$', views.seasons, name='seasons'), ]
Creare la view nel file fantalega/views.py
# noinspection PyUnresolvedReferences from django.shortcuts import render, redirect, get_object_or_404 from .models import Season # noinspection PyUnresolvedReferences from django.contrib import messages def index(request): return render(request, 'fantalega/index.html') def seasons(request): context = {'seasons': Season.objects.order_by('-name')} return render(request, 'fantalega/seasons.html', context)
E ora le templates.
dentro la directory fantalega, creare una sottodirectory “templates” ed al suo interno,
un’altra sottodirectory “fantalega”. ALl’interno di quest’ultima creare un file
base.html:
fantalega\templates\fantalega\base.html
{% load staticfiles %} {# Load the tag library #} {% load bootstrap3 %} {# Load CSS and JavaScript #} {% bootstrap_css %} {% bootstrap_javascript %} {% load app_filters %} {% block head %} {% endblock %} {% block navbar %} <div class="navbar navbar-inverse" role="navigation"> <div class="container"> {% if user.is_anonymous %} <div class="navbar-header"> <a class="navbar-brand"> Bancaldo <font color="green">Fan</font><font color="white">tal</font><font color="red">ega</font> please login</a></div> {% else %} {% if user.is_staff %} <div class="navbar-header"> <a class="navbar-brand" href="{% url 'admin:index' %}"> <font color="red">Admin</font></a></div> {% endif %} <div class="navbar-header"> <a class="navbar-brand" href="{% url 'seasons' %}">Seasons</a></div> {% endif %} <div class="navbar-collapse collapse"> <ul class="nav navbar-nav navbar-right"> {% if not user.is_anonymous %} <li><a class="navbar-brand" href="{% url 'logout' %}"> <font color="orange">logout</font></a></li> {% endif %} </ul> </div> </div> </div> {% endblock %} <html> <head> <title>{% block title %}Django Fantalega{% endblock %}</title> </head> <body> {% if messages %} <ul class="list-unstyled messages"> {% for message in messages %} {% get_bootstrap_alert_msg_css_name message.tags as alert_tag %} <li class="alert alert-{{ alert_tag }}">{{ message }}</li> {% endfor %} </ul> {% endif %} <div class="content container"> <div class="row"> <div class="col-md-8"> {% block content %} {% endblock %} </div> </div> </div> </body> </html>
Questa è la template base dalla quale erediteranno tutte le altre.
Creare ora la template per l’index (fantalega\templates\fantalega\index.html):
{% extends "fantalega/base.html" %} {% block content %} <h1><font color="green">Fantalega</font></h1><br> {% if user %} <b><font color="blue">{{ user.username }}, </font> <font color="orange">you are welcome!</font> </b> {% endif %} {% endblock %}
Poi creare il file fantalega\templates\fantalega\seasons.html
{% extends 'fantalega/base.html' %} {% block content %} <h1><font color="green">List of SEASONS</font></h1> {% if seasons %} <ul> {% for season in seasons %} <li>{{ season.name }}</a></li> {% endfor %} </ul> {% else %} <font color="red"><b>No season found.</b></font> {% endif %} {% endblock %}
Avviare il server qualora già non lo fosse e recarsi all’indirizzo:
python manage.py runserver
ed andare alla pagina http://127.0.0.1:8000/fantalega/seasons
Cosa è successo?
nel file urls.py l’indirizzo suddetto viene matchato dalla regex
r’^seasons/$’ (primo parametro della seconda url della lista urlpatterns), alla quale
corrisponde la view ‘seasons’ (file fantalega/views.py).
In questa views, viene creato un dizionario ‘context’ con all’interno la lista di tutte
le Season presenti nel database
context = {'seasons': Season.objects.order_by('-name')}
il dizionario viene passato alla funzione render() che lo fornisce alla template
‘fantalega/seasons.html’ sotto forma di tag ‘{{ seasons }}’.
In questo caso, il tag seasons non è diretto, ma viene raggiunto tramite ciclo for
‘{% for season in seasons %}’…
Nota:
Come si nota, nella template ‘base.html’, dalla quale ereditiamo, nelle sezioni
navbar, tramite il tag {{ url }} si richiama il nome ‘seasons’, che è il terzo fondamentale
paramtero usato nella costruzione delle urls.
<div class="navbar-header"> <a class="navbar-brand" href="{% url 'seasons' %}">Seasons</a></div>
le seasons sono quindi raggiungibili anche dalla barra superiore (navbar che viene
ereditata da base.html), inoltre se l’utente con il quale ci si logga, è superuser (is_staff),
può amministrare cliccando su Admin.
Salvare gli avanzamenti su github:
git add --all
git commit -m "Season added"
git push -u origin master
articoli precedenti
0 – indice
1 – Virtualenv e Git
articoli successivi
3 – Admin: Login e Logout
4 – Models: League
5 – Models: Team
6 – Models: Match
7 – Models: Player
8 – Asta
9 – Models: Lineup
10 – Models: Trade
11 – Asta di riparazione
12 – Classifica
Commenti recenti