Home > Django > djangofantalega: model Season

djangofantalega: model Season

14 Novembre 2016

2 – djangofantalega: model Season

Creare ‘Season’ (stagione) il primo model dell’applicazione e
madre di tutte le tabelle.

season

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.

admin_season_ok

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:

season_validate_error

altrimenti, rispettando il pattern della regex, il tutto andrebbe a buon fine:

admin_season_ok

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.

seasons

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

Categorie:Django Tag:
I commenti sono chiusi.